4

据我了解,这

/[\d-X]/

标准不允许:

抽象操作 CharacterRange 采用两个 CharSet 参数 A 和 B 并执行以下操作: 1. 如果 A 不包含恰好一个字符或 B 不包含恰好一个字符,则抛出 SyntaxError 异常... ( http://es5.github .io/#x15.10.2.15 )

但是,如果某些(大多数?)浏览器-前面/后面有转义符,则将其视为序数字符,以便上述匹配数字、破折号和 X:

var re = /[\d-X]/g;

for(var i = 0, r = ""; i < 0x10000; i++) {
    var s = String.fromCharCode(i);
    if(!s.replace(re, ''))
        r += s;
}
console.log(r) // -0123456789X

问题:

  • 这种行为在所有引擎中都可以观察到吗?(我已经测试过最新的 Webkit 和 Firefox)
  • 是否有任何解释为什么他们决定违反标准(在文档、来源、邮件列表等中)?
4

1 回答 1

4

我认为标准中15.10.2.16 NonemptyClassRangesNoDash下的注释 3回答了它:

A - 字符可以按字面意思处理,也可以表示一个范围。如果它是 ClassRanges 的第一个或最后一个字符、范围规范的开始或结束限制,或者紧跟在范围规范之后,则按字面意思对待它。

在这种情况下,我认为immediately follows a range specification适用。

其他一些例子:[a-f-h] [\s--9] [\w\d-\s]

于 2013-06-25T10:47:29.867 回答