php - 如何设计一个只捕获没有特定字符组合的字符串的模式?

标签 php regex

我在正则表达式前瞻方面苦苦挣扎,我能找到的所有教程都是关于密码检查的,而不是针对某些字符组合的。

这是一个我不明白的问题,它描述了我与这部分正则表达式的斗争:

$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

我如何设计一个只捕获没有特定颜色的字符串(“我有一个 [颜色] 引擎”)的模式?

最佳答案

否定前瞻之后的 .* 将匹配所有内容,实际上会破坏前瞻的效果。您可以简单地使用以下正则表达式:

I\s(?:(?!(red|green|blue)).)*engine

演示:https://regex101.com/r/tO9nC5/1

请注意,您甚至不需要 .* 在前瞻中,因为您有一个 * 可以匹配每个长度的字符串.

另请注意,如果您想阻止您的正则表达式匹配如下字符串:

I have everything I don't engine

事实上,如果你想匹配 engine 之前的内部 I 你最好将 I 添加到禁用词列表中:

I\s(?:(?!(I|red|green|blue)).)*engine

关于php - 如何设计一个只捕获没有特定字符组合的字符串的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957480/

相关文章:

php - 如何将多个预先确定的 MySQL 字段关联并插入到单选下拉选项

java - 正则表达式从字符串中删除非数字和非小数点

javascript 使用正则表达式得到错误的结果

具有多个否定条件的正则表达式前瞻

javascript - JSON 从最后一个对象中删除尾随逗号

php - 解析 HTML 的 XPath 表达式 - 部分通配符表达式

php - PHP 的 DateTime 中缺少周 -> 修改 ('next week' )

php - MySQL 中的更新定价,其中多个价格位于同一行

php - 如何在 php 中从此 JSON 获取元素

jquery - 正则表达式 - 循环数组并查找 jquery 列表中的第一个字母