好的,所以虽然该模式[abc]
匹配单个字符a
,b
或c
, 但该模式[^abc]
匹配任何不是 a
,b
或的给定字符c
。
现在,如果我在上面的语句中用字符串替换字符,如果我还将第一个模式更改为交替构造,它仍然适用,例如(abc|def|ghi)
. -- 它将匹配三个字符的连续字符串,等于abc
、、def
或ghi
。我能做些什么来匹配任何不等于abc
、、def
或的三个字符的字符串ghi
?
好的,所以虽然该模式[abc]
匹配单个字符a
,b
或c
, 但该模式[^abc]
匹配任何不是 a
,b
或的给定字符c
。
现在,如果我在上面的语句中用字符串替换字符,如果我还将第一个模式更改为交替构造,它仍然适用,例如(abc|def|ghi)
. -- 它将匹配三个字符的连续字符串,等于abc
、、def
或ghi
。我能做些什么来匹配任何不等于abc
、、def
或的三个字符的字符串ghi
?
这是正则表达式的常见问题,简短的回答是“否”,正则表达式的操作方式不提供“除 ... 之外的任何 3 字母字符串”的说法。
然而,一些正则表达式引擎允许所谓的“负前瞻断言”。这些有点难以理解 -如果从技术上讲,这个环视的解释似乎很好地涵盖了它。
前瞻的重要之处在于它是“零宽度”——它不会“用完”任何字符串。因此,在 Javascript 中,您可以匹配这样的字符串:'abc123ghi'.match(/abc(?!def)...ghi/)
-表示后面(?!def)
不能有字母,但需要在那里表示应该有其他 3 个字符。'def'
'abc'
...
您可以使用否定前瞻来执行您所说的一些操作:
xyz(?!abc|def|ghi)
这意味着“xyz 后跟除 abc、def 或 ghi 之外的任何内容”。它实际上并没有消耗源,所以在那之后你会把应该继续匹配的东西放在“xyz”之后。那是,
/xyz(?!abc|def|ghi)(\w*)/
匹配“xyzhello”,第一个捕获组将包含“hello”。