具有字符转义的字符范围

时间:2013-06-25 10:35:39

标签: javascript regex

根据我的理解,这个

/[\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)
  • 是否有任何解释为什么他们决定违反标准(在文档,来源,邮件列表等)?

1 个答案:

答案 0 :(得分:4)

我认为15.10.2.16 NonemptyClassRangesNoDash in the standard下的注3会回答:

  

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

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

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