【问题标题】:Quantifier range not working in lookbehind量词范围在后视中不起作用
【发布时间】:2011-06-24 18:57:24
【问题描述】:

好的,所以我正在开发一个项目,我需要一个正则表达式,它可以匹配 * 后跟 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) 标志。

【问题讨论】:

    标签: php regex lookbehind quantifiers


    【解决方案1】:

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

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

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

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

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

    来自手册:

    lookbehind 断言的内容受到限制,因此它匹配的所有字符串都必须具有固定长度。但是,如果有多个备选方案,它们不必都具有相同的固定长度。因此 (?

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

    【讨论】:

    • 可能还值得一提的是,正则表达式仍然不会执行 OP 可能想要的操作 - 它很乐意匹配超过 4 个空格,因为 .* 可以很好地匹配空格。
    • @Tim - 这是一个很好的观点,但我认为 .* 只是 OP 认为奇怪行为的一个简化示例 - 有趣的部分是背后的外观。
    • 谢谢,我忽略了这一点。顺便说一句,RegexBuddy 并没有抱怨 {1,4}(它对无限量词犹豫不决,但对这个有限量词却没有)。
    • 经过一些交替测试后,它似乎总是只匹配 * 后跟一个空格,因此导致匹配区域以制表符或空格开头,但我想我可以中止后视组为你说然后用字符串操作删除不必要的空间。我想我可以使用子字符串删除第一个字符,然后删除 ltrim。是的,.* 只是为了简化,因为我想要帮助的是向后看。
    • @Tim - 我想这取决于实现:{1,4} 可以扩展为合法的替代,但 PHP 不这样做(这更好,当然,它可能会造成怪物)。我在 pagecolumn.com/tool/pregtest.htm 检查我的 PHP 模式,有时在 ideone 上检查,我想这更接近真实的东西:)
    猜你喜欢
    • 2018-03-09
    • 2012-08-15
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多