18

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

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

4

3 回答 3

30

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

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

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

于 2012-06-01T02:29:08.180 回答
2

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

让我们分开[^]

[]是一个字符类。

[^是个:

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

没有在字符类中定义任何字符。所以行为是未定义的。这意味着没有什么可以否定的,因此它匹配任何东西

于 2012-06-01T01:49:32.150 回答
1

意思是对后面的否定。因此,这里没有任何内容:

除了什么都没有=一切

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

  • ereg(): REG_EBRACK
  • preg_match(): Compilation failed: missing terminating ]
于 2012-06-01T01:48:38.703 回答