在PCRE中是否存在“否定交替”或“否定字符串类”,“否定字符类”这样的事情?

时间:2012-09-15 13:26:19

标签: javascript regex pcre

好吧,虽然模式[abc]匹配abc的单个字符,但模式[^abc]匹配任何给定的字符不是 abc

现在如果我在上面的语句中将 string 替换为字符,如果我还将第一个模式更改为像(abc|def|ghi)这样的交替构造,它仍然适用。 - 它将匹配等于abcdefghi的三个字符的连续字符串。我该怎么做才能匹配等于abcdefghi的三个字符的字符串?

2 个答案:

答案 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”。