5

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

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

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

4

1 回答 1

5

PHP,像许多风格一样,不支持可变长度的后视。唯一的支持是在lookbehind 顶层的alternation ( )。|甚至?可以打破格局。另一种方法是使用:

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

或者更好的是,中止一个组的lookbehind:

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

这对您应该很有效,因为无论如何您似乎都没有重叠匹配项。

从手册:

回溯断言的内容受到限制,因此它匹配的所有字符串都必须具有固定长度。但是,如果有多个备选方案,它们不必都具有相同的固定长度。因此 (?<=bullock|donkey) 是允许的,但 (?<!dogs?|cats?) 在编译时会导致错误。匹配不同长度字符串的分支只允许出现在后向断言的顶层。

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

于 2011-02-10T11:47:46.343 回答