2013-06-25 118 views
4

從我的理解,這字符範圍與字符轉義

/[\d-X]/ 

不是由標準所允許:

的抽象操作CharacterRange需要兩個字符集參數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) // -X 

問題:

  • 這種行爲在所有引擎中都是可觀察的嗎? (我已經測試過最新的Webkit和Firefox)
  • 有沒有任何解釋他們爲什麼決定違反標準(在文檔,來源,郵件列表等)?

回答

4

我想記下3回答15.10.2.16 NonemptyClassRangesNoDash in the standard它:

A - 字符可以從字面上處理,也可以表示一個範圍。如果它是ClassRanges的第一個或最後一個字符, 是範圍規範的開始或結束限制,或者是 如果遵循範圍規範,則它是字面處理的 。

在這種情況下,我認爲immediately follows a range specification適用。

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

+0

是的,這是有道理的。 「範圍規範」這個詞在標準中沒有定義,因此實施者可以自由地在這裏做出自己的決定。 – georg