জাভাস্ক্রিপ্ট - স্ট্রিং রেজেক্সের ব্যাকফেরেন্স


95

আপনি জাভাস্ক্রিপ্ট এ মত backreferences করতে পারেন:

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"));

উত্তর:


120

এটার মত:

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

4
দুর্দান্ত, আমি এই সম্পর্কে আরও তথ্য কোথায় পেতে পারি?
কোয়ানো


11
শীতল। স্পষ্ট করার জন্য: $1এবং $2এখানে ব্যবহারকারী-নির্বাচিত প্যারামিটারের নামগুলি (ব্যাকরেফারেন্স প্রতীকগুলি অনুকরণ করার জন্য বেছে নেওয়া হয়েছে); - বিভিন্ন! - এই পরামিতিগুলির সংখ্যা রেজেজেসে ক্যাপচার গোষ্ঠীর সংখ্যার সাথে মিলে যায়।
mklement0

34

দ্বিতীয় যুক্তি হিসাবে কোনও ফাংশন এতে পাস করুন replace:

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

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

এই সামর্থ্য জাভাস্ক্রিপ্ট 1.3 যেহেতু হয়েছে প্রায় অনুযায়ী mozilla.org


2

ESNext ব্যবহার করে, বেশ একটি ডামি লিঙ্ক replacer কিন্তু ঠিক কীভাবে এটি কাজ করে তা দেখাতে:

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

দ্রষ্টব্য: পূর্ববর্তী উত্তরে কিছু কোড অনুপস্থিত ছিল। এটি এখন স্থির + উদাহরণ।


আমার আগত জেএসওএন ডেটাতে ইউনিকোড ডিকোড করার জন্য একটি রেইগেক্স প্রতিস্থাপনের জন্য আমার আরও কিছুটা নমনীয় কিছু দরকার ছিল:

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 জন্য নীচের সিনট্যাক্স বর্ণনা:

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()পদ্ধতি নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.