2011-07-21 12 views
7

次のコードは有効ですか?" /"はJavaScriptの正規表現内で有効ですか?

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

それは(http://jscompress.com/でjsmin含む)多くのjavascript minifiersはコメントの開始される第2行目に「//」を検討しているようです。私はそれが "trivially"実装されたminifierのバグだと思っています。私が試したすべてのブラウザの実装が問題なく実行されたからです。 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 

\/が考慮されて

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

はと評価しますRegularExpressionBackslashSequenceであり、したがってRegularExpressionBodyの一部であり、その結果、コメントマーカーの一部となることはできません。

3

はい、これは有効なjavascriptです:これは、マイナーのバグであり、おそらく修正する必要があります。キャプチャせずに、

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

基本的に言って、いずれかの文字列の末尾、またはではない文字列の末尾:あなたの正規表現を作ることによってたかったあなたはそれの終わりに愚かな何かなどを持っている場合は、それを回避することができ。しかし、私はそれが良い解決策だとは思っていません。私はそれを自分で使ってはいけません。

+4

Better: 'return new RegExp("/")。exec(" \/");' – BoltClock

+0

ああ、もちろん! haha – Paulpro

+1

@PaulPRO '。| $'は新しい行には一致しないので、元の正規表現と同じではありません。 – Karolis

3

はい、これは合法です。 \/は、リテラル/と一致します。最初の\/をエスケープします。ライン:私はスペックでそれを探しに興味があったし、それに応じてそれが有効である

["/"] 
+0

フィドルで実証されたように:) – BoltClock