Javascript正则表达式中[^]的含义是什么?

Javascript正则表达式中[^]的含义是什么?,javascript,regex,Javascript,Regex,[^a]表示除a以外的任何字符,我们知道,但是[^](没有以下字符)是什么意思?正如-在[-]等情况下失去字符范围的含义一样,我假设[^]将匹配插入符号。我花了很长时间调试这个问题,结果发现至少在Chrome19中它似乎匹配任何东西——换句话说,它相当于。这里是否有适用的规范,或者预期的行为是什么 是的,我知道我可以而且可能应该使用[\^]。这个问题更多的是病态好奇心的本质。其含义是对随后发生的事情的否定。因此,这里没有任何内容: 什么都不做=一切 但是,大多数其他正则表达式引擎会在表达式处抛出

[^a]
表示除
a
以外的任何字符,我们知道,但是
[^]
(没有以下字符)是什么意思?正如
-
[-]
等情况下失去字符范围的含义一样,我假设
[^]
将匹配插入符号。我花了很长时间调试这个问题,结果发现至少在Chrome19中它似乎匹配任何东西——换句话说,它相当于
。这里是否有适用的规范,或者预期的行为是什么


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

其含义是对随后发生的事情的否定。因此,这里没有任何内容:

什么都不做=一切

但是,大多数其他正则表达式引擎会在表达式处抛出错误,尽管:

  • ereg():REG\u EBRACK
  • preg\u match():编译失败:缺少终止]

插入符号
^
有许多含义-就像正则表达式语法中的大多数字符一样。此外,所有角色在很大程度上取决于其上下文。更复杂的是,一些字符和语法依赖于底层引擎(Perl、Java)

让我们分开来看
[^]

[]
是一个字符类

[^
是:

字符类的求反,匹配字符类中未列出的字符


您未定义字符类中的任何字符。因此行为未定义。这意味着没有可否定的内容,因此它匹配任何内容。

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


我不建议使用
[^]
[]
,因为它们在跨浏览器时无法一致工作,并且会阻止正则表达式在其他编程语言中工作。例如,它会否定集合,但如果集合为空……匹配任何东西,只要它不是空的?这似乎不正确。[^]匹配什么?[^]应该匹配[]不匹配的任何内容。根据下面的答案,它的意思是“不应该使用此表达式”!相关性能测试:很棒的帖子!您能更具体地介绍一下Safari和Opera的旧版本吗?谢谢。我不确定是哪个版本解决了问题。我知道Safari 3搞错了。(早期的v3 Safari有很多鲜为人知的RegExp惊喜,因为它运行的是PCRE,上面有一个过于简单的JS层。)Opera在我第一次编写时仍然出错。他们可能在Acid3发布后不久就修复了它,因为Acid3显式地测试空字符类(让我沮丧的是,在那之前,我一直希望ES能够改变以符合传统的行为)。看起来IE直到v9才解决这个问题(我编辑了我的帖子).@Derek,因为
与换行符不匹配。
因此行为未定义。
这可能会让人们相信它是未定义的行为,但事实并非如此,因为它是在ECMA规范中定义的,尽管实现有所不同。