2012-04-16 4 views
1

동일한 정규식에서 여러 입력을 일치시켜 다음 번호를 캡처하려고합니다.
입력이 첫 번째 그룹과 일치하지 않으면 이전 캡처 그룹이 그룹과 일치하지 않아도 캡처되기 때문에 문제가 발생합니다. lookaround 어설 션을 사용해야한다고 생각합니다. 그러나 익숙하지 않습니다.정규식 캡처 그룹이 두 번째 일치 집합으로 흐른다

샘플 입력 :

wordA 123456 
wordA: 123456 
wordA : 123456 
wordA R123465 
wordA: R123456 
wordA : R123456 
wordB R123465 

말로도는이 두 옵션 :R. 지금까지 나는 이것을 가지고있다 : /(?:wordA :?R?(\d+)|wordB R(\d+))/i.

array 
    0 => string 'wordB R123456' (length=13) 
    1 => string '' (length=0) 
    2 => string '123456' (length=6) 

구인 결과는 다음과 같습니다 :

array 
    0 => string 'wordB R123465' (length=13) 
    1 => string '123456' (length=6) 

모든 아이디어를 어떻게 해결하는 마지막 샘플 입력을 사용
는이 결과를 제공?

답변

3

문제는 그래서 정규식이 두 번째 대안 일치하는 경우, 결과는 2 군 (array[2])와 첫 번째 그룹이 비어있을 것

/(?:wordA :?R?(\d+)|wordB R(\d+))/i 
       ^^^^^  ^^^^^ 
      Group 1  Group 2 

당신의 교대

입니다. (단 하나가 있기 때문에)이

(?:wordA :?R?|wordB R)(\d+) 

변경은,

+0

감사합니다. 나는 그것이 2 개의 그룹을 가지고 있기 때문에 그것이 있었다라는 것을 알고 있었다. 그러나 나는 첫번째 부분이 didnt한지 알았다, 그리고, 나머지는 무시 될 것이다. 이것은 잘못된 가정이었습니다. – Kim

1

당신은 두 개의 캡처 그룹을 정의하는 것이 here on Regexr

그런 다음 전화 번호는 항상 첫 번째 그룹에있을 것입니다 참조 따라서 결과적으로 두 가지를 얻게됩니다. regex 구현은 한 번에 하나만 일치 할 수 있는지 상관하지 않습니다. 두 개의 캡처 그룹 정의를 피하기 위해 표현식을

으로 다시 작성할 수 있습니다. :?R?은 테스트 사례를 _:_ 또는 :_과 일치시키는 데 충분하지 않습니다. 그 (것)들을 얻기 위하여는, 당신은 사용할 수 있었다

/(?:wordA ?:? R?|wordB R)(\d+)/i