下面的JavaScript輸出什麼(甚至不是「假」),實際上停止任何其他JavaScript網頁上運行:爲什麼正則表達式/ [_-%] /打破JavaScript?
var pattern = new RegExp(/[_-%]/);
document.write(pattern.test("foo"));
這是什麼這個正則表達式,這是否?如果三個字符(_, - 或%)中的任何一個被刪除,則一切正常。如果三個字符的順序完全改變,那麼一切正常。
下面的JavaScript輸出什麼(甚至不是「假」),實際上停止任何其他JavaScript網頁上運行:爲什麼正則表達式/ [_-%] /打破JavaScript?
var pattern = new RegExp(/[_-%]/);
document.write(pattern.test("foo"));
這是什麼這個正則表達式,這是否?如果三個字符(_, - 或%)中的任何一個被刪除,則一切正常。如果三個字符的順序完全改變,那麼一切正常。
[]塊中的連字符用於範圍。所以_到%是無效的。 你可以逃脫它:
var pattern = new RegExp(/[_\-%]/);
或移動到開始:
var pattern = new RegExp(/[-_%]/);
或結尾:
var pattern = new RegExp(/[_%-]/);
因爲regex知道在開始一個連字符(或結束,感謝BrunoLM!)意思是一個文字連字符而不是範圍。
或結束'[_% - ]' – BrunoLM 2011-05-14 03:05:40
這是因爲在翻譯認爲它處理的範圍。就像/[a-z]/
將匹配a
和z
之間的任何字符,/[_-%]/
將(嘗試)匹配_
和%
之間的任何字符。這沒有意義,所以JavaScript停止。將連字符作爲第一個或最後一個字符將解決問題。
也可以通過使用\ - 來逃避範圍語義。 – 2011-05-14 03:05:05
這是中間的短跑。 JavaScript將[_-%]
視爲角色等級範圍,與[A-Z]
類似。我猜你正在使用的瀏覽器根本無法很好地處理這種情況。我建議將連字符移到前面,或用反斜槓(\-
)將其跳出。
使用以下代替:
/[-_%]/
的 - 會被解釋爲一個範圍。你也可以使用\ -
有意思的是,如果你交換'%'和'_',它會起作用,但可能並不如你所期望的那樣('%'是ASCII 45,'_'是ASCII 137 )。 – Reid 2011-05-14 03:19:33