2011-07-21 35 views
7

以下代碼是否有效?在JavaScript正則表達式中「 /」是否有效?

function test() { 
    return /\//.exec("\/"); 
} 
alert(test()); 

似乎很多的JavaScript minifiers(包括http://jscompress.com/ jsmin)審議「//」,第二行是一個註釋的開始。我認爲這是「簡單」實現的縮減器中的一個錯誤,因爲我試過的所有瀏覽器實現都沒有問題。 Try it on jsfiddle

+3

所以這就是爲什麼一些正則表達式引擎允許你指定不同的分隔符... – BoltClock

+0

我想知道規範是如何表明這不會開始評論。 – pimvdb

+1

也許'var q =「//」;'的方式是有效的。 –

回答

3

我很感興趣,在規格看它,並根據它有效:

RegularExpressionLiteral :: 
    /RegularExpressionBody/RegularExpressionFlags 
RegularExpressionBody :: 
    RegularExpressionFirstChar RegularExpressionChars 
RegularExpressionChars :: 
    [empty] 
    RegularExpressionChars RegularExpressionChar 
RegularExpressionFirstChar :: 
    RegularExpressionNonTerminator but not * or \ or/or [ 
    RegularExpressionBackslashSequence 
    RegularExpressionClass 
RegularExpressionChar :: 
    RegularExpressionNonTerminator but not \ or/or [ 
    RegularExpressionBackslashSequence 
    RegularExpressionClass 
RegularExpressionBackslashSequence :: 
    \ RegularExpressionNonTerminator 
RegularExpressionNonTerminator :: 
    SourceCharacter but not LineTerminator 

\/被認爲是一個RegularExpressionBackslashSequence,因此是RegularExpressionBody的一部分,因此不能成爲//評論標記的一部分。

3

是的,這是有效的javascript :)這是一個在minifier中的錯誤,應該可能被修復。你可以避開它,如果你通過使您的正則希望有在它的結束愚蠢的東西,如:

return /\/(?:.|$)/.exec("\/"); 

這基本上說,無論是字符串的結尾,或者不是字符串的結束,而不捕獲。但我不認爲這是一個很好的解決方案,我不會使用它自己哈哈。

+4

更好:'return new RegExp(「/」)。exec(「\ /」);' – BoltClock

+0

啊,當然! haha – Paulpro

+1

@PaulPRO'。| $'與新行不匹配,所以它不等同於原始正則表達式。 – Karolis

3

是的,這是合法的。 \/符合字面意思/。第一個\逃脫/。行:

/\//.exec("\/"); 

則計算結果爲:

["/"] 
+0

正如在小提琴中所演示:) – BoltClock

相關問題