【问题标题】:Negative Lookbehind Regex not working in PHP负后向正则表达式在 PHP 中不起作用
【发布时间】:2020-05-08 04:22:52
【问题描述】:

我用 PHP 编写了一段代码,旨在匹配一个副词(以“ly”结尾的词),该副词应该匹配任何单词,即每天、每周、每月、每天两次、双周刊等。

例如,给定句子Locally meet daily for 3 days,只有Locally 应该匹配。

我使用否定的lookbehind确定了正则表达式语法,但 PHP 给我一个错误:

编译失败:后向断言在偏移处不是固定长度..

这是我在 PHP 中的完整代码:

<?php
$sentence = "Locally meet daily for next 3 days";

// Use preg_match() function to check match 
preg_match('/(\w+ly)(?<!(daily|weekly|monthly))/', $sentence, $matches, PREG_OFFSET_CAPTURE); 

// Display matches result 
print_r($matches); 

我已经尝试过负前瞻,但它并没有给我带来有希望的结果。有人可以建议可以做什么吗?谢谢

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您可以使用否定前瞻,但它必须在匹配组之前。您还需要在正则表达式的开头添加一个分词 (\b) 断言,以便(例如)正则表达式与 daily 中的 aily 不匹配,并且在末尾添加另一个,所以你不要t 匹配中间带有ly 的单词,例如newlywed:

    $sentence = "Locally meet daily newlywed for next 3 days";
    
    preg_match_all('/\b(?!(?:daily|weekly|monthly))(\w+ly)\b/', $sentence, $matches, PREG_OFFSET_CAPTURE); 
    
    print_r($matches); 
    

    输出:

    Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [0] => Locally
                        [1] => 0
                    )
            )
        [1] => Array
            (
                [0] => Array
                    (
                        [0] => Locally
                        [1] => 0
                    )
            )
    )
    

    Demo on 3v4l.org

    【讨论】:

    • 我怎样才能排除像 bidaily、biweekly 这样的词?
    • 要么把这些词放在交替中,要么在它之前添加(?:bi)?,即\b(?!(?:bi)?(?:daily|weekly|monthly))(\w+ly)
    • 谢谢尼克。我解决了这个问题:preg_match_all('/\b(?!(?:\w*(daily|weekly|monthly)))(\w+ly)/', $sentence, $matches, PREG_OFFSET_CAPTURE);
    • @solutionhacker 这可能更简单。请注意,我刚刚想到您需要在正则表达式的末尾换一个单词,这样您就不会在中间匹配带有 ly 的单词。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2023-03-13
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多