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

Jus*_*nas 3 php regex negative-lookbehind

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

adminUpdate
adminDeleteEx
adminEditXe
adminExclude
listWebsite
listEx
Run Code Online (Sandbox Code Playgroud)

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

因此在应用正则表达式之后我必须匹配:

adminUpdate
adminEditXe
adminExclude
Run Code Online (Sandbox Code Playgroud)

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

nha*_*tdh 6

只是略有变化:

/^admin[a-z]+(?<!ex)$/gi
               ^
Run Code Online (Sandbox Code Playgroud)

把你的前瞻变成一个后视.

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

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

/^admin[a-z]+$(?<!ex)/gi
Run Code Online (Sandbox Code Playgroud)

以这种方式编写它是违反直觉的,但更容易看出我的论点在哪里.

看看它的另一种方式是:由于这样的事实(?!ex)$被零宽度断言,他们是在相同的位置检查,并且是在字符串的结束$ 意味着你将看不到任何未来.