量词范围不适用于后视

时间:2011-02-10 11:15:03

标签: php regex lookbehind quantifiers

好的,所以我正在开发一个项目,我需要一个可以匹配*后跟1-4个空格或制表符然后跟着一行文本的正则表达式。现在我正在使用。*后面的测试目的。但是我可以让它明确匹配1,2或4个空格/制表符,但不能匹配1-4。我正在测试以下块

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

这些是我正在测试(?<=(\*[ \t]{3})).*的两种模式,它们按预期工作并与第二行匹配,如果我用1,2或4替换3则相同但是如果我用1,4替换它以下模式(?<=(\*[ \t]{1,4})).*它不再匹配任何行,我真的不明白为什么。我试过谷歌搜索没有成功。我正在使用g(lobal)旗帜。

1 个答案:

答案 0 :(得分:5)

PHP与许多版本一样,不支持可变长度的lookbehind。唯一的支持是在外观顶层的交替|)。即使?也可以打破这种模式。另一种方法是使用:

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

或者更好的是,中止群组的后视:

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

这应该适合你,因为你似乎没有重叠你的比赛。

从手册:

  

lookbehind断言的内容受到限制,因此它匹配的所有字符串必须具有固定长度。但是,如果有多种替代方案,则它们并非都必须具有相同的固定长度。因此允许(?&lt; = bullock),但是(?&lt;!dogs?| cats?)在编译时导致错误。匹配不同长度字符串的分支仅允许在lookbehind断言的顶层。

来源:http://www.php.net/manual/en/regexp.reference.assertions.php