为什么JS Regexp中不支持“否定交替”或“否定字符串类”,也许还有其他类似的?

时间:2012-09-21 17:14:25

标签: javascript regex

我可以/[abcd]//(ab|cd)//[^wxyz]/。为什么不/(^wx|yz)/

Apparently您可以通过简单地将功能与其他功能结合在一起来实现完全相同的效果,例如:/(?!wx|yz)../

那么为什么不直接支持这个功能呢?有潜在的原因吗?

2 个答案:

答案 0 :(得分:2)

所以,想象一下(^wx|yz)意味着 - 正如你明显想要的那样 - “既不是wx也不是yz的双字符序列”。 (^vwx|yz)意味着什么?它是否意味着“两个或三个字符的序列既不是vwx也不是yz”?这是否意味着“ 三个字符的序列不是vwx而且不是以yz开头的双字符序列是yz“?

字符类符号[...]的强大功能 - 让它支持范围a-z,它支持否定等等 - 是它始终匹配单个字符。一旦你删除了这个限制,就不再清楚这些东西意味着什么了。

答案 1 :(得分:1)

您期望/(^wx|yz)/的行为是什么?对我而言,似乎空字符串会满足您提议的“否定交替”。如果您希望它尝试匹配相同数量的字符,那么使用可变长度正则表达式的否定替换呢?

我想在这里得到的是,否定的替换实现起来太模糊了,最明显的做法是将其作为零宽度断言,所以你可以使用{{1} }。