Вы можете сделать обратную ссылку в JavaScript следующим образом:
var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");
Это (довольно глупо) заменит "$ test" на "test". Но представьте, что я хотел бы передать полученную строку $ 2 в функцию, которая возвращает другое значение. Я попытался сделать это, но вместо строки «test» получил «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"));
javascript
regex
backreference
Quano
источник
источник
$1
и$2
- здесь имена параметров, выбранные пользователем (выбраны для имитации символов обратной ссылки); картинка - разная! - количество этих параметров соответствует количеству групп захвата в регулярном выражении.Передайте функцию в качестве второго аргумента
replace
:str = str.replace(/(\$)([a-z]+)/gi, myReplace); function myReplace(str, group1, group2) { return "+" + group2 + "+"; }
Согласно mozilla.org, эта возможность появилась с Javascript 1.3 .
источник
Использование 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;
источник
Примечание. В предыдущем ответе отсутствовал код. Теперь исправлено + пример.
Мне нужно было что-то более гибкое для замены регулярного выражения для декодирования юникода в моих входящих данных JSON:
var text = "some string with an encoded 's' in it"; text.replace(/&#(\d+);/g, function() { return String.fromCharCode(arguments[1]); }); // "some string with an encoded 's' in it"
источник
Если у вас будет переменное количество обратных ссылок, тогда количество аргументов (и места) также будут переменными. В веб-документации MDN описан следующий синтаксис для выделения функции в качестве аргумента замены:
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, потому что она имеет тип,
Arguments
а не тип,Array
поэтому у нее нетslice()
метода.источник