4

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

adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx

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

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

adminUpdate
adminEditXe
adminExclude

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

4

2 回答 2

8

只是一个轻微的变化:

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

将您的前瞻变成后视。

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

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

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

以这种方式写它是违反直觉的,但更容易看出我的论点。

另一种看待它的方式是:由于(?!ex)and$是零宽度断言,它们在相同的位置被检查,并且位于字符串的末尾$ 意味着您将看不到任何前面的内容。

于 2015-01-08T07:29:36.477 回答
3
^(?!.*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);
于 2015-01-08T07:31:07.243 回答