2013-02-17 2 views
2

정규식에 대한 문제를 해결하려고합니다. 분명히 Perl과 비슷한 Java 정규식을 사용하고 있습니다.정규 표현식 : 문자를 사용한 연속 반복

하나 이상의 숫자가 연속적으로 반복되거나 1 ~ 9 사이의 반복을 사용하는 문자열을 검색하고 싶습니다.

예 : 12333, 123w3, 12ww3, ww123은 모두 일치해야하지만 12345, 1234w, 1323w는 일치하지 않아야합니다.

"[[0-9] w] {3,"} 패턴을 시도했지만 왜 이것이 틀린 지 이해합니다. 누군가 내 요구 사항에 맞는 검색 패턴을 구성하는 데 대한 단서를 몇 가지 제공 할 수 있습니까? 나는 (당신이 쓴 것과 확실하지이기 때문에 - 당신이주는 예보다) w 와일드 카드인지 제대로 이해하고

+0

'123w3','12ww3' 및'ww123'은 어떻게 요구 사항과 일치합니까? 첫 번째 경우에는 2 3이 있고 두 번째 경우에는 반복되는 숫자가없고 세 번째 경우에는 'w'가 숫자 사이에 없습니다. –

+0

나는 이것을 이해하기 어렵다고 생각한다. 그리고 왜 '1323w'가 유효하지 않은가 (33w를 가짐)? '12ww3'는'12223'과 같거나'12333'입니까? '123ww'은 어때? – Kobi

+1

일치 기준을 명확히하십시오. – MikeM

답변

4

다음이 정규식 작동합니다 ...

([1-9])(\1|w){2,}|w([1-9])(\3|w)+|ww([1-9])\5* 

이 어쩌면이다 ...

  # matches that don't start with wildcards 
([1-9]) # get a digit, and capture for future reference 
(\1|w){2,} # the captured digit, or the letter w, 2 or more times 
|   # or, matches that start with a single w 
w   # match a w 
([1-9]) # get a digit, and capture for future reference 
(\3|w)+ # get one or more of the captured digit, or letter w 
|   # or, matches starting with two w 
ww   # get two w 
([1-9]) # get a digit, and capture for future reference 
\5*  # get all the successive captured digits 

이 또한 작동합니다 ... 아니 가장 우아한 해결책은하지만, 일을해야하고, 휴식과 같은 부분으로

([1-9])(\1|w){2,}|w([0-9](\3|w)|w[0-9]) 
,
+1

숫자가 약간 떨어져서,'([0-9]) (? : \ 1 | w) {2} | w ([0-9]) (? : \ 2 | w) | ww ([0-9])'. '\ 1'은 항상 첫 번째 그룹 인'([0-9])'이며, 첫 번째 변경 사항이 일치하지 않으면 비어 있습니다. – Kobi

+0

@kobi 감사합니다. 지금 편집 해 주셨습니다. 지금 바르게 수정하십시오. –

+0

@BillyMoon 그래, 바로 내가 찾고있는 내용이었습니다. 솔루션을 여러 부분으로 나누는 데 시간을내어 주셔서 감사드립니다. 그것은 내가 정규 표현식을 배우기 시작할 때만이 중요했습니다. 엄청 고마워! – balajeerc

관련 문제