2011-02-10 5 views
5

좋아요. 그래서 나는 * 또는 1-4 공백이나 탭과 일치 할 수있는 정규 표현식을 필요로하고 그 다음에 텍스트 행이 오는 프로젝트에서 작업하고 있습니다. 지금은 테스트 목적으로 lookbehind 후. *를 사용하고 있습니다. 그러나 명확하게 1, 2 또는 4 공백/탭과 일치하도록 얻을 수 있지만 1-4 아닙니다. 나는 다음과 같은 블록한정자 범위가 lookbehind에서 작동하지 않습니다.

* test line here 
* Second test 
* Third test 
* Another test 

에 대해 테스트하고있어이 내가 대체 만약 내가 같은 단지 예상대로 작동 및 제 2 라인을 일치 (?<=(\*[ \t]{3})).*을 테스트하고있어 두 패턴입니다 3 1, 2 또는 4 그러나 경우 나는 다음 패턴을 형성하는 1,400으로 바꿉니다. (?<=(\*[ \t]{1,4})).* 더 이상 어떤 행과도 일치하지 않으며 솔직히 이유를 이해할 수 없습니다. 나는 성공하지 않고 인터넷 검색을 시도했다. 나는 g (lobal) 플래그를 사용하고 있습니다.

답변

5

PHP는 다양한 맛과 마찬가지로 가변 길이 lookbehind를 지원하지 않습니다. 유일한 지원은 lookbehind의 최상위에서 (|)입니다. ?조차 패턴을 깨뜨릴 수 있습니다.

(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).* 

또는 더 나은, 그룹에 대한 lookbehind을 중단 : 당신이 당신의 일치의 중복을 가지고있는 것처럼 보이지 않기 때문에

\*[ \t]{1,4}(.*) 

이, 당신을 위해 잘 작동합니다 대안은 사용하는 것입니다 어쨌든. 수동에서

하십시오 lookbehind 주장의

내용은 일치하는 모든 문자열이 고정 된 길이를 가져야한다는 등의 제한됩니다. 그러나 여러 대안이있는 경우 모두 동일한 고정 길이를 가져야하는 것은 아닙니다. 따라서 (? < = bullock | donkey)는 허용되지만 (? <! dogs? cats?) 컴파일 타임에 오류가 발생합니다. 서로 다른 길이의 문자열과 일치하는 가지는 lookbehind 어설 션의 최상위 수준에서만 허용됩니다.

출처 :. 또한 정규식은 여전히 ​​영업 이익은 아마 원하는 것을하지 않을 것이라는 점을 언급 할 가치가있을 수도 있습니다 http://www.php.net/manual/en/regexp.reference.assertions.php

+1

- 그것은 기꺼이 '때문에 4 개 이상의 공간을 일치합니다 *'잘 공간을 일치합니다. –

+1

@Tim - 좋은 지적이지만,'. * '는 OP가 이상한 행동으로 보는 단순한 예일뿐입니다. 재미있는 부분은 뒤에서 보는 것입니다. – Kobi

+0

고마워, 나는 그것을 간과했다. 그건 그렇고, RegexBuddy는'{1,4}'에 대해서 불평하지 않습니다 (무한한 양의 값으로는 쓰이지 만이 한정적인 값으로는 쓰지 않습니다). –