量词范围不适用于后视

Hul*_*ner 5 php regex lookbehind quantifiers

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

*    test line here
*   Second test
*  Third test
* Another test
Run Code Online (Sandbox Code Playgroud)

这些是我正在测试的两种模式(?<=(\*[ \t]{3})).*,它们按照预期工作并匹配第二行,如果我用1,2或4替换3,那么如果我用1,4替换它形成以下模式(?<=(\*[ \t]{1,4})).*它不再匹配任何行和我老实说无法理解为什么.我试过谷歌搜索没有成功.我正在使用g(lobal)旗帜.

Kob*_*obi 5

与许多风格一样,PHP不支持可变长度的lookbehind.唯一的支持是在lookbehind顶层的alternation(|).即使是一个?可以打破模式.另一种方法是使用:

(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).*
Run Code Online (Sandbox Code Playgroud)

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

\*[ \t]{1,4}(.*)
Run Code Online (Sandbox Code Playgroud)

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

从手册:

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

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