2014-02-22 3 views
2

은 내가 특별히, 정규 표현식을 검토하고 있고 정규 표현식은 주어진 문자열과 일치하지 않을 이유를 이해할 수 없다 :Ruby 정규 표현식의 우선 순위가?

regex = /(ab*)+(bc)?/ 
mystring = "abbc" 

경기는 "abb" 일치하지만 c 꺼 둡니다. Rubular와 IRB를 사용하여 이것을 테스트했으며 정규식이 전체 문자열과 일치하지 않는 이유를 이해하지 못합니다. (ab*)+"ab"과 일치하고 (bc)?"bc"과 일치한다고 생각했습니다.

정규 표현식 작업의 우선 순위 측면에서 뭔가가 빠졌습니까?

답변

3

괄호가있는 정규식은 문자열에 일치하는 것이 2 개 있다고 가정합니다.

(ab*)a이고 0 이상은 b이므로 첫 번째 것은 abb입니다. 당신은 두 b을 가지고 있으므로 일치는 abb입니다. 그런 다음 문자열에 c 만 있으므로 두 번째 조건 인 bc과 일치하지 않습니다.

+0

아를하다 한 언어의 문자 만 (bc)? 그것이 나처럼 절대 일치하지 않는 것처럼 보인다. 이 올바른지? – jskoeh9

+0

다시 collisons :-) –

+0

예, 정규식이 이상하게 보입니다. – alex

5

정규 표현식은 정규 표현식의 첫 부분을 가능한 한 많이 일치 시키려고 시도하며 이 아닌 역 추적을 수행하여 필요하지 않은 경우 더 큰 섹션을 일치 시키려고합니다. (bc)을 선택적으로 설정 했으므로 (ab*)은 원하는만큼 일치 할 수 있습니다 (많이하지 않아도 0이 아닌 반복). 다른 일치하는 대안을 시도하기 위해 역 추적을 시도하지 않습니다. (이 경우 일부 되돌아을 강제하는) 당신은 문자열의 양쪽 끝 앵커 확인 전체 문자열이 일치 할 경우

: 그래서 A, B, C를 가정

regex = /^(ab*)+(bc)?$/ 
+0

전체 문자열을 앵커와 일치시키는 법을 알려 주셔서 감사합니다. – jskoeh9

+0

@ jskoeh9 질문하신 질문 뒤에 _real_ 질문이라고 생각했습니다 ... –