我解决了与IE9相关的正则表达式问题,但我不确定它是如何工作的或原因

时间:2015-10-09 20:47:25

标签: javascript regex browser web internet-explorer-9

背景

我最近遇到的问题是正常表达式在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引擎中的边缘情况?

1 个答案:

答案 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月)中始终相同。