Javascript regexps中[^]的含义是什么?

18 javascript regex

[^a]是指除了a我们知道之外的任何字符,但是[^](没有后续字符)是什么意思?就像-在这样的情况下失去其字符范围的含义一样[-],我认为这[^]将与插入符号相匹配.我花了太长时间来调试这个问题,但却发现至少在Chrome 19中看起来它似乎匹配任何东西 - 换句话说,相当于..这里是否有适用的规范或预期的行为是什么?

是的,我知道我可以而且可能应该使用[\^].这个问题更多的是病态的好奇心.

sle*_*han 30

根据JavaScript规范(ES3和ES5),[^]匹配任何单个的代码单元,同为[\s\S],[\0-\uffff],(.|\s)(不要使用;不像其它的,它依赖于回溯)等从该差.是,没有按点"吨匹配的四个换行代码点(\r,\n,\u2028,和\u2029).

我不建议使用[^][],因为它们不能一致地跨浏览器工作,并且它们阻止您的正则表达式使用其他编程语言.IE <= 8且旧版本的Safari对空字符类使用传统(非JavaScript)正则表达式行为.较早版本的Opera会反转正确的JavaScript行为,因此[]匹配任何代码单元并且[^]永远不会匹配.传统的正则表达式行为是将]字符类中未处理的前导字符视为文字字符,而不是结束字符类.

如果您使用XRegExp库,[]并且[^]正确且一致地跨浏览器工作.XRegExp还添加了s(也称为dotall或singleline)标志,使得点匹配任何代码单元(与[^]正确遵循JavaScript规范的浏览器相同).

  • 谢谢.我不确定哪个版本修复了这些问题.我知道Safari 3弄错了.(早期的v3 Safari有许多鲜为人知的RegExp惊喜,因为它运行的PCRE上面有一个太简单的JS层.)当我第一次写http://xregexp.com/cross_browser/时,Opera仍然出错了.他们可能在Acid3释放后不久修复它,因为Acid3明确地测试了空字符类(令我沮丧的是,直到那个出现之前我希望ES可以改变以匹配传统行为).看起来IE实际上没有解决问题,直到v9(我编辑了我的帖子). (2认同)