2011-05-14 50 views
3

下面的JavaScript輸出什麼(甚至不是「假」),實際上停止任何其他JavaScript網頁上運行:爲什麼正則表達式/ [_-%] /打破JavaScript?

var pattern = new RegExp(/[_-%]/); 
document.write(pattern.test("foo")); 

這是什麼這個正則表達式,這是否?如果三個字符(_, - 或%)中的任何一個被刪除,則一切正常。如果三個字符的順序完全改變,那麼一切正常。

+0

有意思的是,如果你交換'%'和'_',它會起作用,但可能並不如你所期望的那樣('%'是ASCII 45,'_'是ASCII 137 )。 – Reid 2011-05-14 03:19:33

回答

6

[]塊中的連字符用於範圍。所以_到%是無效的。 你可以逃脫它:

var pattern = new RegExp(/[_\-%]/); 

或移動到開始:

var pattern = new RegExp(/[-_%]/); 

或結尾:

var pattern = new RegExp(/[_%-]/); 

因爲regex知道在開始一個連字符(或結束,感謝BrunoLM!)意思是一個文字連字符而不是範圍。

+0

或結束'[_% - ]' – BrunoLM 2011-05-14 03:05:40

1

這是因爲在翻譯認爲它處理的範圍。就像/[a-z]/將匹配az之間的任何字符,/[_-%]/將(嘗試)匹配_%之間的任何字符。這沒有意義,所以JavaScript停止。將連字符作爲第一個或最後一個字符將解決問題。

+0

也可以通過使用\ - 來逃避範圍語義。 – 2011-05-14 03:05:05

0

這是中間的短跑。 JavaScript將[_-%]視爲角色等級範圍,與[A-Z]類似。我猜你正在使用的瀏覽器根本無法很好地處理這種情況。我建議將連字符移到前面,或用反斜槓(\-)將其跳出。

0

使用以下代替:

/[-_%]/ 

的 - 會被解釋爲一個範圍。你也可以使用\ -

相關問題