我必须在其前面加上单词'like'
,而不是单词'not'
。在下面的示例中,单词'not'
前面有'like'
,所以它不应该与之匹配。我该如何解决这个问题?
$tempInput = "i do not like to fail";
if (preg_match("~(?!not )(like)~", $tempInput, $match)) {
print_r($match);
}
结果:
数组([0] =>如[1] =>喜欢)
需要结果:
空
答案 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'