जावास्क्रिप्ट - स्ट्रिंग रेगेक्स बैकरेफरेंस


93

आप जावास्क्रिप्ट में इस तरह से पीछे हट सकते हैं:

var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");

यह (काफी मूर्खतापूर्ण) "परीक्षण" के साथ "परीक्षण" को प्रतिस्थापित करेगा। लेकिन कल्पना कीजिए कि मैं $ 2 के परिणामी स्ट्रिंग को एक फ़ंक्शन में पास करना चाहता हूं, जो एक और मूल्य देता है। मैंने ऐसा करने की कोशिश की, लेकिन स्ट्रिंग "परीक्षण" प्राप्त करने के बजाय, मुझे "$ 2" मिलता है। क्या इसको हासिल करने के लिए कोई रास्ता है?

// Instead of getting "$2" passed into somefunc, I want "test"
// (i.e. the result of the regex)
str = str.replace(/(\$)([a-z]+)/gi, somefunc("$2"));

जवाबों:


117

ऐशे ही:

str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })

1
बहुत बढ़िया, मुझे इस बारे में अधिक जानकारी कहां मिल सकती है?
14


11
ठंडा। स्पष्ट करने के लिए: $1और $2यहां उपयोगकर्ता-चुना हुआ पैरामीटर नाम हैं (बैकरेक्शन प्रतीकों की नकल करने के लिए चुना गया); - अलग-अलग! - इन मापदंडों की संख्या रेगेक्स में कैप्चर समूहों की संख्या से मेल खाती है।
mklement0

34

दूसरे तर्क के रूप में एक फ़ंक्शन पास करें replace:

str = str.replace(/(\$)([a-z]+)/gi, myReplace);

function myReplace(str, group1, group2) {
    return "+" + group2 + "+";
}

Mozilla.org के अनुसार, यह क्षमता जावास्क्रिप्ट 1.3 के आसपास है ।


1

ESNext का उपयोग करना, काफी डमी लिंक प्रतिकृति है लेकिन यह दिखाने के लिए कि यह कैसे काम करता है:

let text = 'Visit http://lovecats.com/new-posts/ and https://lovedogs.com/best-dogs NOW !';

text = text.replace(/(https?:\/\/[^ ]+)/g, (match, link) => {
  // remove ending slash if there is one
  link = link.replace(/\/?$/, '');
  
  return `<a href="${link}" target="_blank">${link.substr(link.lastIndexOf('/') +1)}</a>`;
});

document.body.innerHTML = text;


0

नोट: पिछला उत्तर कुछ कोड गायब था। अब यह तय हो गया है + उदाहरण।


मुझे अपने आने वाले JSON डेटा में यूनिकोड को डिकोड करने के लिए एक regex की जगह कुछ और अधिक लचीले कुछ चाहिए था:

var text = "some string with an encoded '&#115;' in it";

text.replace(/&#(\d+);/g, function() {
  return String.fromCharCode(arguments[1]);
});

// "some string with an encoded 's' in it"

0

यदि आपके पास बैकरेफेरेंस की एक परिवर्तनीय राशि होगी तो तर्क संख्या (और स्थान) भी परिवर्तनशील होगी। MDN वेब डॉक्स प्रतिस्थापन तर्क के रूप में एक समारोह sepcifing के लिए follwing वाक्य रचना का वर्णन:

function replacer(match[, p1[, p2[, p...]]], offset, string)

उदाहरण के लिए, इन नियमित अभिव्यक्तियों को लें:

var searches = [
    'test([1-3]){1,3}',  // 1 backreference
    '([Ss]ome) ([A-z]+) chars',  // 2 backreferences
    '([Mm][a@]ny) ([Mm][0o]r[3e]) ([Ww][0o]rd[5s])'  // 3 backreferences
];
for (var i in searches) {
    "Some string chars and many m0re w0rds in this test123".replace(
        new RegExp(
            searches[i]
            function(...args) {
                var match = args[0];
                var backrefs = args.slice(1, args.length - 2);
                // will be: ['Some', 'string'], ['many', 'm0re', 'w0rds'], ['123']
                var offset = args[args.length - 2];
                var string = args[args.length - 1];
            }
        )
    );
}

आप यहाँ 'तर्क' चर का उपयोग नहीं कर सकते क्योंकि यह प्रकार का है Argumentsऔर किसी प्रकार का नहीं है Arrayइसलिए इसमें कोई slice()विधि नहीं है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.