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


Regex negative match in middle of string

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

adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx

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

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

adminUpdate
adminEditXe
adminExclude

我当前的正则表达式/^admin[a-z]+(?!ex)$/gi但它与任何以 admin 开头的内容相匹配

只是略有变化:

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

将您的前瞻变为后视。

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

由于环顾四周是零宽度,我们可以在不改变含义的情况下交换 (?<!ex)$的位置(不过,它确实改变了引擎搜索匹配字符串的方式):

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

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

另一种看待它的方法是:由于(?!ex)$是零宽度断言,因此它们在同一位置进行检查,并且位于字符串$的末尾意味着您不会看到任何内容。

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

试试这个。请参阅演示。

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

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