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

时间:2012-06-01 01:45:22

标签: javascript regex

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

是的,我知道我可以而且可能应该使用{{1}}。这个问题更多的是病态的好奇心。

3 个答案:

答案 0 :(得分:30)

根据JavaScript规范(ES3和ES5),[^]匹配任何单个代码单元,与[\s\S][\0-\uffff](.|\s)相同(不等)使用它;与其他人不同,它依赖于回溯)等。与.的区别在于点与四个换行代码点(\r,{{1}不匹配},\n\u2028)。

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

如果您使用XRegExp库,则][]可以正常且一致地进行跨浏览。 XRegExp还添加了[^](又名dotall或单行)标记,使得点匹配任何代码单元(与正确遵循JavaScript规范的浏览器中的s相同)。

答案 1 :(得分:2)

插入符^有很多含义 - 正则表达式语法中的大多数字符都是如此。此外,所有角色都严重依赖于他们的背景。更复杂的是,一些字符和语法依赖于底层引擎(Perl,Java)。

让我们分开[^]

[]是一个角色类。

[^是:

  

否定字符类,匹配字符类中未列出的字符。

没有定义字符类中的任何字符。 所以行为是 undefined 。意思是没有否定,因此它匹配任何

答案 2 :(得分:1)

意思是否定以下内容。因此,这里没有任何内容:

  

除了没有的东西=一切

但是,大多数其他RegEx引擎会在表达式中抛出错误:

  • ereg(): REG_EBRACK
  • preg_match(): Compilation failed: missing terminating ]