好吧,虽然模式[abc]
匹配a
,b
或c
的单个字符,但模式[^abc]
匹配任何给定的字符不是 a
,b
或c
。
现在如果我在上面的语句中将 string 替换为字符,如果我还将第一个模式更改为像(abc|def|ghi)
这样的交替构造,它仍然适用。 - 它将匹配等于abc
,def
或ghi
的三个字符的连续字符串。我该怎么做才能匹配不等于abc
,def
或ghi
的三个字符的字符串?
答案 0 :(得分:2)
这是正则表达式的一个常见问题,简短的回答是“不”,正则表达式操作的方式并没有提供说“除了......之外的任何3个字母的字符串”的方法。
然而,一些正则表达式引擎允许所谓的“负向前瞻断言”。如果有点技术性的话,this explanation of lookaround似乎能很好地覆盖它,这有点棘手。
关于前瞻的重要一点是它是“零宽度” - 它不会“消耗”任何字符串。因此,在Javascript中,您可以匹配以下字符串:'abc123ghi'.match(/abc(?!def)...ghi/)
- (?!def)
表示'def'
后面不能包含字母'abc'
,而...
需要在那里说,那里应该有其他3个字符。
答案 1 :(得分:0)
你可以使用否定的先行来做你所说的一些事情:
xyz(?!abc|def|ghi)
这意味着“xyz后跟除abc,def或ghi之外的任何内容”。它实际上并不消耗源,因此在“xyz”之后你会放置应继续匹配的东西。也就是说,
/xyz(?!abc|def|ghi)(\w*)/
匹配“xyzhello”,第一个捕获组将包含“hello”。