匹配正则表达式没有一个单词背后的另一个单词

时间:2016-03-28 21:31:35

标签: php regex preg-match

我必须在其前面加上单词'like',而不是单词'not'。在下面的示例中,单词'not'前面有'like',所以它不应该与之匹配。我该如何解决这个问题?

$tempInput = "i do not like to fail";
if (preg_match("~(?!not )(like)~", $tempInput, $match)) {

print_r($match);

}

结果:

数组([0] =>如[1] =>喜欢)

需要结果:

2 个答案:

答案 0 :(得分:2)

negative lookbehind这样的文字字符串not就可以了。

正则表达式: /(?<!not )like/

<强>解释

  • (?<!not )look behind并检查是否有not字。

  • like如果不存在,则like将匹配。

<强> Regex101 Demo

答案 1 :(得分:1)

这里有一点 regex magic

使用固定宽度的lookbehind断言很容易限制 例如,noob的正则表达式(?<!not )like匹配not like无效格式&gt; s 整天(不好)。

但是这个(?<!not)(?<!\s)\s*\b(like)将匹配变量
长度lookbehind在php中是合法的。

在理想的世界中,这将是(?<!not\s+)like变量。

所以,我把它留给任何想知道它是如何工作的人 like字始终位于捕获组1中。

作为奖励,like组可以是任何正则表达式子表达式。

 (?<! not )        # Guard, Not 'not' behind
 (?<! \s )         # Guard, Not whitespace behind 
 \s*               # Optional whitespace that can't be backtracked
 \b                # Word boundary
 ( like )          # (1), 'like'