문제

이 문제에 대한 답을 찾을 수없는 것 같습니다. 단순화 된 예 :

"nn"의 모든 경기뿐만 아니라 서로 겹치는 것과도 잘하는 문자열 "nnnn"을 고려하십시오. 따라서 REGEX는 다음 3 경기를 제공합니다.

  1. NNNN
  2. NNNN
  3. NNNN

나는 이것이 Regexes의 의미가 아니라는 것을 알고 있지만, 현악기를 걷고 수동으로 구문 분석하는 것은 실제로 일치가 문자 그대로 문자열이 아닌 패턴을 사용하여 수행해야한다는 점을 고려할 때 끔찍한 코드처럼 보입니다.

도움이 되었습니까?

해결책

가능한 솔루션은 사용하는 것입니다 뒤에 긍정적 인 모습:

(?<=n)n

그것은 당신에게 다음의 종말 위치를 줄 것입니다.

  1. *n *** n ** nn
  2. n*n *** n ** n
  3. nn*n *** n **

언급 한 바와 같이 티모시 코우리, ㅏ 긍정적 인 전망 더 직관적입니다

나는 그의 제안을 선호합니다 (?=nn)n 더 간단한 형태 :

(n)(?=(n))

그것은 참조 할 것입니다 첫 번째 위치 당신이 원하는 줄의 그룹 (2)에서 두 번째 N을 캡처합니다..

그 이유는 다음과 같습니다.

  • 유효한 정규 표현식은 전망대 내에서 사용할 수 있습니다.
  • 캡처 괄호가 포함 된 경우 역 번호가 저장됩니다.

따라서 그룹 (1)과 그룹 (2)은 'n'을 나타내는 모든 것을 포착합니다 (복잡한 정규식이더라도).

다른 팁

캡처 그룹 작업과 함께 전망대를 사용하여 정규식이 느리고 복잡해지기 위해 비용을 지불합니다. 대안적인 솔루션은 다음 경기 시도가 시작되어야하는 regex.match () 메소드를 알려주는 것입니다. 이 시도:

Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); 
}

Afaik, 한 번에 그렇게 할 수있는 순수한 Regex 방법은 없습니다 (즉, 루프없이 요청한 세 가지 캡처를 반환).

이제 패턴을 한 번 찾을 수 있고 오프셋으로 시작하여 검색에서 루프를 찾을 수 있습니다 (찾은 위치 + 1). Regex 사용을 간단한 코드와 결합해야합니다.

편집] 좋아요
편집 2] 명확하게 : Jan의 대답이 더 좋습니다. 더 정확하지는 않지만 확실히 더 상세하게 선택해야합니다. 나는 여전히 내 것이 왜 틀린 것을 볼 수 없기 때문에, 나는 왜 내 것이 다운 투자되는지 이해하지 못한다. 큰 문제가 아니라 성가신 일입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top