문제
이 문제에 대한 답을 찾을 수없는 것 같습니다. 단순화 된 예 :
"nn"의 모든 경기뿐만 아니라 서로 겹치는 것과도 잘하는 문자열 "nnnn"을 고려하십시오. 따라서 REGEX는 다음 3 경기를 제공합니다.
- NNNN
- NNNN
- NNNN
나는 이것이 Regexes의 의미가 아니라는 것을 알고 있지만, 현악기를 걷고 수동으로 구문 분석하는 것은 실제로 일치가 문자 그대로 문자열이 아닌 패턴을 사용하여 수행해야한다는 점을 고려할 때 끔찍한 코드처럼 보입니다.
해결책
가능한 솔루션은 사용하는 것입니다 뒤에 긍정적 인 모습:
(?<=n)n
그것은 당신에게 다음의 종말 위치를 줄 것입니다.
- *n *** n ** nn
- n*n *** n ** n
- 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의 대답이 더 좋습니다. 더 정확하지는 않지만 확실히 더 상세하게 선택해야합니다. 나는 여전히 내 것이 왜 틀린 것을 볼 수 없기 때문에, 나는 왜 내 것이 다운 투자되는지 이해하지 못한다. 큰 문제가 아니라 성가신 일입니다.