2015-12-29 13 views
6

Mi sono imbattuto in $& quando uso le espressioni regolari. Se utilizzo $1 ottengo lo stesso risultato di $&. Che cosa è speciale con $&, e dove è documentato?

Quando cerco "espressione regolare + $ &" su duckduckgo o google non riesco a trovare corrispondenze rilevanti.

Nell'esempio seguente è possibile utilizzare $1 o $&. Cosa c'è di speciale in $ & e perché esiste?

Vedi una fiddle con l'esempio

<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' = cosa è stato abbinato al primo gruppo. '$ &' = ciò che è stato abbinato all'intera regex. – ndn

+0

Dove posso leggere come $ & funziona? (documentazione) – emanciperingsivraren

+1

@emanciperingsivraren Nella pagina [MDN su 'replace'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter). – Xufox

risposta

4

Il $& e $1 non sono gli stessi.

Si ottiene lo stesso valore perché è stato incluso l'intero motivo in un gruppo di cattura.

Il $& è un backreference per tutta la partita, mentre $1 è un backreference al submatch catturate con l'acquisizione di gruppo 1.

See MDN String#replace() reference:

$&                               Inserisce la sottostringa corrispondente.
$n o $nn     Dove n o nn sono cifre decimali, inserisce la stringa submatch tra parentesi n th, purché il primo argomento è un oggetto RegExp.

Maggiori dettagli su replacement backreferences can be found at regular-expressions.info.

+0

Si noti che '$ &' è un costrutto utile che consente di non utilizzare alcun gruppo di cattura all'interno del modello quando è necessario fare riferimento all'intero testo abbinato dal modello di sostituzione. Nella maggior parte delle lingue (non in Perl!) Puoi tranquillamente usare questo '& $' e omettere le parentesi senza ricapitolazione esterna. –

2

$& restituisce l'intera stringa con corrispondenza mentre $1, $2, ... restituisce la corrispondenza acquisita. So che sembra strano, ma vedi perlre for more info.

Si consideri il seguente:

'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

$& è una "sostituzione" (segnaposto per qualcosa che deve essere sostituito in) per il intera partita (tutto il testo corrispondente). $1 è una "sostituzione" per il primo gruppo di acquisizione.

Quindi:

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

ci dà

 
testt 

perché il $& è st e il $1 è t.

+0

I '$ &' e '$ n' non sono chiamati segnaposto, ma backreferences. –

+1

@stribizhev: non in 'replace' non lo sono. Si chiamano ["sostituzioni"] (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace). I riferimenti a ritroso sarebbero * entro * la regex e JavaScript non li ha. –

+0

@ dev-null: errore di modifica Stoopid, grazie! –

Problemi correlati