2015-12-29 2 views
6

Я наткнулся на $&, когда я использую регулярные выражения. Если я использую $1, то получаю тот же результат, что и у $&. Что особенного с $&, и где оно задокументировано?

Когда я ищу «регулярное выражение + $ &» на duckduckgo или google Не найдено подходящих совпадений.

В приведенном ниже примере можно использовать $1 или $&. Что особенного в $ &, и почему он существует?

См fiddle на примере

<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

Где я могу узнать о том, как работает $ &? (документация) – emanciperingsivraren

+1

@emanciperingsivraren На [странице MDN о 'replace'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter). – Xufox

ответ

4

$& и $1 не то же самое.

Вы получаете то же значение, потому что вы включили весь шаблон в группу захвата.

$& является обратной ссылкой на весь матч, а $1 является обратной ссылкой на submatch захватили с захватом группы 1.

См MDN String#replace() reference:

$&                               Вставляет совпадающую подстроку.
$n или $nn     Где n или nn являются десятичными цифрами, вставляет n-ю строку в скобках submatch, при условии, что первый аргумент был 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 является «заменой» для первой группы захвата.

Итак:

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

дает нам

 
testt 

потому что $& является st и $1 является t.

+0

'$ &' и '$ n' не называются заполнителями, а обратные ссылки. –

+1

@stribizhev: Не в 'replace' они не являются. Их называют [«заменами»] (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace). Backreferences будет * внутри * регулярного выражения, а JavaScript их не имеет. –

+0

@ dev-null: Ошибка редактирования Stoopid, спасибо! –

Смежные вопросы