2015-12-29 28 views
6

Tôi đã tình cờ gặp $& khi tôi sử dụng cụm từ thông dụng. Nếu tôi sử dụng $1 tôi nhận được kết quả tương tự như với $&. Điều gì đặc biệt với $&, và tài liệu được ghi ở đâu?

Khi tôi tìm kiếm cụm từ thông dụng + $ & "trên duckduckgo hoặc google, tôi không thể tìm thấy bất kỳ kết quả phù hợp nào.

Trong ví dụ bên dưới, bạn có thể sử dụng $1 hoặc $&. Điều gì đặc biệt về $ & và tại sao nó tồn tại?

Xem fiddle với ví dụ

<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' = nội dung được nhóm đầu tiên so khớp. '$ &' = những gì đã được so khớp với toàn bộ regex. – ndn

+0

Tôi có thể đọc về cách thức hoạt động của $? (tài liệu) – emanciperingsivraren

+1

@emanciperingsivraren Trên [trang MDN về 'thay thế'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter). – Xufox

Trả lời

4

Các $&$1 là không giống nhau.

Bạn nhận được cùng một giá trị vì bạn đã đính kèm toàn bộ mẫu trong nhóm chụp.

Các $& là một backreference cho toàn bộ trận đấu, trong khi $1 là một backreference đến submatch chụp bằng chụp nhóm 1.

Xem MDN String#replace() reference:

$&                               Chèn chuỗi con phù hợp.
$n hoặc $nn     đâu n hoặc nn là số thập phân chữ số, chèn thứ n chuỗi ngoặc submatch, với điều kiện các đối số đầu tiên là một đối tượng RegExp.

Thêm chi tiết về replacement backreferences can be found at regular-expressions.info.

+0

Lưu ý rằng '$ &' là một cấu trúc tiện dụng cho phép bạn không sử dụng bất kỳ nhóm chụp nào bên trong mẫu khi bạn cần tham chiếu toàn bộ văn bản phù hợp từ mẫu thay thế. Trong hầu hết các ngôn ngữ (không phải Perl!), Bạn có thể sử dụng một cách an toàn '& $' này và bỏ qua các dấu ngoặc đơn ngoài. –

2

$& trả về toàn bộ chuỗi phù hợp trong khi $1, $2, ... trả lại kết quả đã chụp. Tôi biết nó nghe có vẻ lạ, nhưng hãy xem perlre for more info.

xem xét như sau:

'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

$& là một "thay thế" (giữ chỗ cho một cái gì đó để được thay thế trong) cho đầy đủ trận đấu (tất cả các văn bản phù hợp). $1 là "thay thế" cho nhóm chụp đầu tiên.

Vì vậy:

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

cho chúng ta

 
testt 

$&st$1t.

+0

'$ &' và '$ n' không được gọi là trình giữ chỗ, mà còn là các tham chiếu ngược. –

+1

@stribizhev: Không phải trong 'thay thế', chúng không phải. Chúng được gọi là ["thay thế"] (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace). Backreferences sẽ là * trong * regex, và JavaScript không có chúng. –

+0

@ dev-null: Lỗi chỉnh sửa lỗi, cảm ơn bạn! –

Các vấn đề liên quan