2015-12-29 16 views
6

正規表現を使用すると、$&がつまずきました。 $1を使用すると、$&と同じ結果になります。 $&とは何が特別で、どこに文書番号が記載されていますか?

duckduckgoまたはgoogleで「正規表現+ $ &」を検索すると、関連性の高い一致は見つかりません。

$1または$&を使用することができます。 $ &の特典は何ですか?それはなぜ存在するのですか?

<div id="quotes"> 
    <ul> 
    <li>Поехали! 
     <ul> 
     <li><b>Let's go!</b></li> 
     <li>Variant translations: <b>Let's ride!</b></li> 
     <li><b>Let's drive!</b></li> 
     <li><b>Off we go!</b></li> 
     </ul> 
    </li> 
    </ul> 
    <ul> 
    <li><i>Облетев Землю в корабле-спутнике, я увидел, как прекрасна наша планета. Люди, будем хранить и преумножать эту красоту, а не разрушать её!</i> 
     <ul> 
     <li><b>Orbiting Earth in the spaceship, I saw how beautiful our planet is. People, let us preserve and increase this beauty, not destroy it!</b></li> 
     </ul> 
    </li> 
    </ul> 
</div> 

<script> 
    var quotes = document.getElementById("quotes"), 
     html = quotes.innerHTML, 
     match = /(let)/gi; 

    // $1 gives same result 
    quotes.innerHTML = html.replace(match, "<mark>$&</mark>"); 
</script> 
+1

'$ 1' =最初のグループと一致したもの。 '$&' =正規表現全体と一致したもの。 – ndn

+0

$&はどのように動作するのですか? (documentation) – emanciperingsivraren

+1

@emanciperingsivraren [replace]に関する[MDN]ページ(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter)にあります。 – Xufox

答えて

4

$&$1例でfiddleを参照してくださいは同じではありません。

パターン全体をキャプチャグループに囲んでいるため、同じ値が得られます。

$&              :$1グループ1

参照MDN String#replace() referenceを捕捉と捕捉部分マッチに前方参照されている間 $&

は、全試合に後方参照であります               一致する部分文字列を挿入します。 n又はnnは小数点の数字である
$n又は$nn    、n番目の括弧内の部分マッチ文字列を挿入し、最初の引数はRegExpオブジェクトありました。 replacement backreferences can be found at regular-expressions.info

詳細。

+0

'$&'は、置換パターン全体から参照する必要がある場合に、パターン内のキャプチャグループを使用しないようにする便利な構文です。ほとんどの言語(Perlではなく)では、この '&$'を安全に使うことができ、外側のエスケープされていないカッコを省略することができます。 –

2

$&$1,$2、...はキャプチャした一致を返しますが、一致する文字列全体を返します。私はそれが奇妙に聞こえることを知っているが、perlre for more infoを参照してください。

は、次のことを考えてみましょう:

'abc abc'.replace(/(a)(b)./g, '$1'); // a a 
'abc abc'.replace(/(a)(b)./g, '$2'); // b b 
'abc abc'.replace(/(a)(b)./g, '$&'); // abc abc 
2

$&完全一致ための「交換」(で置換することを何かのためのプレースホルダ)(すべてのマッチしたテキスト)です。 $1は、最初のキャプチャグループの「置き換え」です。

ので:$&stで、$1tあるので

var str = "test".replace(/s(t)/, "$&$1"); 

は私たちに

 
testt 

を与えます。

+0

'$&'と '$ n'はプレースホルダと呼ばれるのではなく、後方参照です。 –

+1

@stribizhev: 'replace'ではなく、そうではありません。彼らは["置換"](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace)と呼ばれています。後方参照は*正規表現内に*あり、JavaScriptはそれらを持っていません。 –

+0

@ dev-null:Stoopid編集エラーです、ありがとうございます! –