字符串中间的正则表达式否定匹配

Regex negative match in middle of string

我有这些字符串(分别检查每一行):

adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx

现在我想匹配任何以 admin 开头但不以 Ex 结尾的内容(不区分大小写)

所以在应用正则表达式后我必须匹配:

adminUpdate
adminEditXe
adminExclude

My current regex is /^admin[a-z]+(?!ex)$/gi 但它匹配任何以 admin

开头的内容

稍作改动:

/^admin[a-z]+(?<!ex)$/gi
               ^

把你的前瞻变成回顾。

以目前的形式很难解释。基本上,您需要到达字符串的末尾 $ 才能匹配正则表达式,当它发生时,(?!ex) 位于字符串的末尾,因此它看不到前面的任何内容。然而,由于我们在字符串的末尾,我们可以使用后视 (?<!ex) 来检查字符串是否以 ex 结尾。

因为 look-around 是零宽度的,我们可以交换 (?<!ex)$ 的位置而不改变意思(虽然它确实改变了引擎搜索匹配字符串的方式) :

/^admin[a-z]+$(?<!ex)/gi

这样写是违反直觉的,但更容易看出我的论点在哪里。

另一种看法是:由于(?!ex)$是零宽度断言,所以在同一个位置检查,并且在最后string $ 意味着你不会看到任何东西。

^(?!.*Ex$)admin.*$

尝试 this.See 演示。

https://regex101.com/r/sH8aR8/23

$re = ""^(?!.*Ex$)admin.*$"m";
$str = "adminUpdate\nadminDeleteEx\nadminEditXe\nadminExclude\nlistWebsite\nlistEx";

preg_match_all($re, $str, $matches);