[^a]
表示除 之外的任何字符a
,我们知道,但是[^]
(没有以下字符)是什么意思?就像-
在诸如 的情况下失去其字符范围的含义一样[-]
,我认为这[^]
将匹配插入符号。我花了太长时间调试这个问题,才发现至少在 Chrome 19 中它似乎匹配任何东西——换句话说,相当于.
. 这里是否有适用的规范或预期的行为是什么?
是的,我知道我可以并且可能应该使用[\^]
. 这个问题更多地是病态的好奇心。
[^a]
表示除 之外的任何字符a
,我们知道,但是[^]
(没有以下字符)是什么意思?就像-
在诸如 的情况下失去其字符范围的含义一样[-]
,我认为这[^]
将匹配插入符号。我花了太长时间调试这个问题,才发现至少在 Chrome 19 中它似乎匹配任何东西——换句话说,相当于.
. 这里是否有适用的规范或预期的行为是什么?
是的,我知道我可以并且可能应该使用[\^]
. 这个问题更多地是病态的好奇心。
根据 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
的相同)。[^]
插入符号^
有很多含义 - 与正则表达式语法中的大多数字符一样。此外,所有角色都严重依赖于他们的上下文。更复杂的是,一些字符和语法依赖于底层引擎(Perl、Java)。
让我们分开[^]
:
[]
是一个字符类。
[^
是个:
字符类的否定,匹配字符类中未列出的字符。
您没有在字符类中定义任何字符。所以行为是未定义的。这意味着没有什么可以否定的,因此它匹配任何东西。
意思是对后面的否定。因此,这里没有任何内容:
除了什么都没有=一切
但是,大多数其他 RegEx 引擎在表达式中抛出错误:
ereg(): REG_EBRACK
preg_match(): Compilation failed: missing terminating ]