如果我有代码:
ex(?!a)
将匹配exi exu exo等...但不是exa。
但是为什么当我使用这段代码时:
ex(?!a)plasma
它不会与explasma或exoplasma相匹配?为什么?
我希望匹配任何 ex [X]血浆格式,其中 [X] 是除“a”之外的任何字符。代码有什么问题?
答案 0 :(得分:2)
基于http://www.regular-expressions.info/lookaround.html的以下文档:
“lookaround”,是零长度断言,就像行的开头和结尾,以及本教程前面解释的单词锚点的开始和结束。区别在于环视实际匹配字符,但随后放弃匹配。
它们不消耗字符串中的字符,但仅断言是否可以匹配。如果你想匹配除特殊字符以外的任何字符,你可以使用否定字符类:
ex[^a]plasma
答案 1 :(得分:1)
答案 2 :(得分:1)
因为零宽度断言不会移动正则表达式引擎的位置(因此名称)。
你的意思是
ex(?!a).plasma
注意点。这会将位置向前移动一个字符,匹配“不是a
”。
同样,ex(?!a)
与"ex"
中的"exo"
相匹配,但与整个"exo"
不匹配。
答案 3 :(得分:1)
首先让我们看看你在ex(?!a)
做了些什么。你说的是。
按字面匹配
ex
,如果a
不存在则向前看。
您正在说ex(?!a)plasma
。
按字面匹配
ex
,如果a
不存在则向前看。如果没有,则匹配plasma
。
在其中任何一个中,您都没有提到在ex
之后匹配任何内容。要在ex
之后匹配任何字母,您必须在。之后使用字符类[a-z]
。
尝试使用此正则表达式:ex(?!a)[a-z]plasma
这将匹配exiplasma
或exoplasma
,但不是 exaplasma
。
<强> Regex101 Demo 强>