我正在努力应对正则表达式的前瞻,我能找到的所有教程都是用于密码检查,而不是用于某些字符组合。
这是一个我不明白的问题,它描述了我与正则表达式的这一部分的斗争:
$string1 = 'I have a yellow engine, I have a black engine';
$string2 = 'I have a yellow engine, I have a red engine';
$string3 = 'I have a red engine, I have a black engine';
$pattern = '~I.*?(?!.*(red|green|blue)).*?engine~';
$preg_match_all($pattern, $string[1-3], $matches);
$string1
正确匹配:
0 => "I have a yellow engine"
1 => "I have a black engine"
$string2
匹配整个字符串,$string3
匹配$string1
。
如何在没有特定颜色的情况下设计仅捕获字符串('我有[颜色]引擎')的模式?
答案 0 :(得分:2)
负面预测后的.*
将匹配所有内容,实际上会破坏前瞻的效果。您只需使用以下正则表达式:
I\s(?:(?!(red|green|blue)).)*engine
演示:https://regex101.com/r/tO9nC5/1
请注意,您甚至不需要在{-1}}中使用.*
,因为它有一个*
,这使得它匹配每个字符串长度。
另请注意,如果您想阻止正则表达式匹配以下字符串:
I have everything I don't engine
事实上,如果您想在I
之前匹配内部engine
,最好将I
添加到禁用词列表中:
I\s(?:(?!(I|red|green|blue)).)*engine