2013-08-12 3 views
0

숫자 값과 일치하는 정규식이있는 작은 코드 스 니펫과 대괄호 안의 선택 텍스트가 이어지고 'A'문자로 끝납니다. 예내 regex는 3 번 일치해야하지만 두 번만 일치합니다 (PHP)

preg_match_all("/([0-9]+)(?:\[(.*)\])?A/", "123[SomeText]A345[SomeOtherText]A678A", $matches); 
print_r($matches); 

이며, 예상되는 결과는 3 경기하는 것입니다 : 위의 코드는 두 번 일치하면서

Array 
(
    [0] => Array 
     (
      [0] => 123[SomeText]A 
      [1] => 345[SomeOtherText]A 
      [2] => 678A 
     ) 

    [1] => Array 
     (
      [0] => 123 
      [1] => 345 
      [2] => 678 
     ) 

    [2] => Array 
     (
      [0] => SomeText 
      [1] => SomeOtherText 
      [2] => 
     ) 
) 

을 :

Array 
(
    [0] => Array 
     (
      [0] => 123[SomeText]A345[SomeOtherText]A 
      [1] => 678A 
     ) 

    [1] => Array 
     (
      [0] => 123 
      [1] => 678 
     ) 

    [2] => Array 
     (
      [0] => SomeText]A345[SomeOtherText 
      [1] => 
     ) 
) 

내가 뭘 잘못 볼 수 없습니다 주어진 정규식에서. 정규식 수정에 대한 제안은 언제나 환영합니다.

답변

3

귀하의 문제는 greediness입니다. 한정 기호 (예 : .*)는 최대한 많이 사용합니다. 그리고 .]과 일치 할 수 있기 때문에 첫 번째 마감 인 ]을 마지막으로지나갑니다. .*?을 사용하여 반복을 불투명하게 만들 수 있습니다 (가능한 한 적게 매칭). 그러나 더 나은 (더 빠른) 옵션이 있습니다. 당신이 허용되는 문자에서 제거하여, 폐쇄 ]지나 갈 수 있다는 것을 확인하십시오가 있기 때문에 실제로, 닫기 괄호를 탈출하지 않아도

Working demo.

/([0-9]+)(?:\[([^\]]*)\])?A/ 
클래스의 첫 번째 문자 (빈 클래스는 허용되지 않으므로 이스케이프 처리하지 않아도 됨) - 다른 클래스는 클래스 외부에 있으므로 닫는 대괄호가 될 수 없습니다.

/([0-9]+)(?:\[([^]]*)])?A/ 

Working demo.

당신이 선호하는 변종은 맛의 문제입니다.

'/(\d*)([^A]*)/' 

을하지만, 각 부품 경우 처음에 번호를 가지고 새 부품으로 끝 : 당신이 당신의 텍스트는 'A'문자가 포함되지 않는다는 확신이 있다면

+0

나는 그것이 '탐욕'과 관련이있을 거라고 생각이 라인

'/(\d*)([^\d]*)/' 

을하지만이 작업을해야합니다 어떻게/어디에서 그것을 고려해야할지 확신하지 못했습니다. 대답 해 주셔서 감사합니다. – Alex

+0

정답 일뿐만 아니라 빠르고 정확한 해결책을 제시하는 데 필요한 추가 수준의 정규 표현식에 대한 훌륭한 설명. +1 – ridgerunner

0

이 무늬는 어떻습니까? .

\d+(\[.*?\])?A 
2

* 표시 욕심 때문에 변경 :

<?php 
preg_match_all("/([0-9]+)(?:\[([^A]*)\])?A/", "123[SomeText]A345[SomeOtherText]A678A", $matches); 
print_r($matches); 

그것을 밖으로 시도 : http://3v4l.org/BZgmH

0

음, 다음이 작동합니다

preg_match_all('/(\d*)([^\d]*)/', "123[SomeText]A345[SomeOtherText]A678A", $matches, PREG_SET_ORDER); 
print_r($matches); 
관련 문제