背景
我最近遇到的问题是正常表达式在IE9中没有按预期工作。我将问题跟踪到表达式中的特定块,即[^]。
from to values product year
1 A B 5 x 1990
2 A B 8 x 1991
3 C A 10 y 1990
4 C A 2 z 1990
5 D B 6 w 1991
6 A D 3 w 1992
问题
var reg = /((?:abc.[^]*?)?test\s*(?:xyz)?\s*)[^]*?/;
换句话说:
输入:
var str = 'abc 123\nabc 123\nabc 123\ntest xyz';
var reg = /((?:abc.[^]*?)?test\s*(?:xyz)?\s*)[^]*?/;
alert(reg.exec(str));
输出
abc 123
abc 123
abc 123
test xyz
尝试解决方案
我发现[^]块导致了错误。通过简单地将[^]切换到[\ S \ s],我就可以在IE9中获得预期的输出。
Expected: ["abc 123\nabc 123\nabc 123\ntest xyz","abc 123\nabc 123\nabc 123\ntest xyz"]
Chrome: ["abc 123\nabc 123\nabc 123\ntest xyz","abc 123\nabc 123\nabc 123\ntest xyz"]
IE9: ["test xyz", "test xyz"] // Wrong!!!
输出
var str = 'abc 123\nabc 123\nabc 123\ntest xyz';
var reg = /((?:abc.[\S\s]*?)?test\s*(?:xyz)?\s*)[\S\s]*?/;
alert(reg.exec(str));
问题
那么[^]和[\ S \ s]之间的本质区别是什么?这里有什么问题?我只是处理IE-javascript引擎中的边缘情况?
答案 0 :(得分:2)
[^]
和[\s\S]
之间没有区别。 {Javascript规范中存在[^]
,但IE9并没有像许多其他Javascript功能一样处理它。
似乎[^]
是AFAIK特有的Javascript。我从未在其他正则表达式中看到它。在其他版本中,[^]
可以看作是语法错误,也可以看作是未闭合的字符类(在这种情况下,结束括号不是字符类的结尾,因为它紧跟在^
之后如果存在,则最终将在下一个结束括号中关闭。)
请注意,自第一次将正则表达式功能添加到语言(ECMA-262, 3rd edition 1999年12月)以来,[^]
和[]
是允许的。
在ECMA-262第三版规范(15.10.2.13)中,您可以读到负字符类的定义如下:
CharacterClass :: [^ ClassRanges ]
其中ClassRanges
可以为空。
此定义在6th edition(2015年6月)中始终相同。