2015-12-29 15 views
6

$& पर ठोकर खाई है I अगर मैं $1 का उपयोग करता हूं तो मुझे $& के साथ एक ही परिणाम मिलता है। $&, के साथ विशेष क्या है और यह कहां से प्रलेखित है?नियमित अभिव्यक्तियों का उपयोग करते समय

जब मैं डकडकगो या 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

मैं कहां पढ़ सकता हूं और कैसे काम करता है? (प्रलेखन) – emanciperingsivraren

+1

@emanciperingsivraren [एमडीएन पृष्ठ 'के बारे में' प्रतिस्थापन'] पर (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter)। – Xufox

उत्तर

4

$& और $1 के साथ एक fiddle देखें ही नहीं हैं।

आपको वही मूल्य मिलता है क्योंकि आपने कैप्चरिंग समूह में पूरे पैटर्न को संलग्न किया है।

$&, पूरे मैच के लिए एक backreference है, जबकि $1 समूह 1.

MDN देखें String#replace() reference पर कब्जा करने के साथ कब्जा कर लिया submatch करने के लिए एक backreference है:

$&                               मिलान किए गए सबस्ट्रिंग को सम्मिलित करता है।
$n या $nn     कहाँ n या nn दशमलव अंक हैं, n वें parenthesized submatch स्ट्रिंग सम्मिलित करता है, बशर्ते पहले तर्क एक RegExp वस्तु थी।

replacement backreferences can be found at regular-expressions.info पर अधिक जानकारी।

+0

ध्यान दें कि '$ &' एक आसान निर्माण है जो आपको पैटर्न के अंदर किसी भी कैप्चरिंग समूह का उपयोग न करने की अनुमति देता है जब आपको प्रतिस्थापन पैटर्न से पूरे मिलान किए गए टेक्स्ट को संदर्भित करने की आवश्यकता होती है। अधिकांश भाषाओं में (पर्ल नहीं!) आप सुरक्षित रूप से इस 'और $' का उपयोग कर सकते हैं और बाहरी अनचाहे कोष्ठक को छोड़ सकते हैं। –

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 और $1t है।

+0

'$ &' और '$ n' को प्लेसहोल्डर्स नहीं कहा जाता है, लेकिन बैक्रेरेंस। –

+1

@stribizhev: 'प्रतिस्थापन' में नहीं वे नहीं हैं। उन्हें ["प्रतिस्थापन"] कहा जाता है (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace)। बैकरेफर * रेगेक्स के भीतर * होगा, और जावास्क्रिप्ट में उनके पास नहीं है। –

+0

@ dev-null: Stoopid संपादन त्रुटि, धन्यवाद! –

संबंधित मुद्दे