[^a]
表示a
以外的任何字符,我们知道,[^]
(没有后续字符)是什么意思?就像-
在[-]
等情况下[^]
失去其字符范围的含义一样,我认为.
与插入符号匹配。我花了太长时间来调试这个问题,但发现至少在Chrome 19中看起来它似乎匹配任何东西 - 换句话说,相当于[\^]
。这里是否有适用的规范或预期的行为是什么?
是的,我知道我可以而且可能应该使用{{1}}。这个问题更多的是病态的好奇心。
答案 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 ]