2011-01-14 3 views
3

私はCase insensitive string replacement in JavaScript?からコードを参照のうえいます:

RegExp.escape = function(str) 
{ 
    var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\ 
    return str.replace(specials, "\\$&"); 
} 

\\$&は何を意味するのでしょうか?

\\\文字をエスケープすると思います。その後$&、私は$1が最初の試合に合うと思った? tho $1は正しく動作しません。

答えて

4

$&は、キャプチャグループに関係なく、正規表現にマッチした(サブ)文字列全体を表します。あなたが得た置換結果は、リテラルのバックスラッシュ(\\で表される)によってエスケープされる文字列のそれぞれの一致です。ここで使われている正規表現は文字クラスだけで構成されているので、 "各一致"は一致する文字クラスにリストされている各メタ文字を参照します。

たとえば、正規表現文字列[abc]\[abc\]に置き換えられます。それは文字クラスで起こるよう

  • [が一致しています。 \[

  • aに置き換え、$&に代表される、bcは文字クラスではメタ文字ではありませんので、彼らは

  • ]を無視している、それは文字クラスで発生するよう適合されます。 $&で表される、正規表現は、キャプチャグループを使用していないことを\]

0

$&この例では、いずれの特殊文字も一致しています。 $1はグループが正規表現に含まれていないので機能しません(ただし、角括弧のまわりに括弧を追加しても動作します)。

はい、最初の '\'は他のものをエスケープします(通常、バックスラッシュは次の文字と組み合わせて使用​​するため、別のバックスラッシュでエスケープする必要があります)。

0

に置き換えます。彼はちょうどs/[.*+?|()\[\]{}\\]/\\$&/g

あまり知られていないという事実に相当の時間 で1文字に一致している。この場合

$& returns the entire matched string (some systems its $0)
:Perlではquotemetaと呼ばれる機能(「あなたはそこにあるどうやら彼は、一般的な正規表現変数を使用しています文字列 ")、これは
であるか、\ Qで正規表現でインライン化することができます。私はPerlが大好きです。注意点として、彼は必ず^ carretを残し、おそらく、しかししていない可能性がある

、$
なし内蔵またはインライン方式は悪いことかもしれませんが存在しないという事実が。正規表現の断片は問題になる可能性があるので、このようなメタクラスをエスケープする必要があります。

関連する問題