JavaScript-обратные ссылки на регулярные выражения строк



вы можете backreference, как это в JavaScript:



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


Это было бы (довольно глупо) заменить "$test" на "test". Но представьте, что я хотел бы передать полученную строку $2 в функцию, которая возвращает другое значение. Я пробовал это, но вместо того, чтобы получить строку "test", я получаю "$2". Есть ли способ достичь этого?



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

5 ответов:

такой:

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

передать функцию в качестве второго аргумента replace:

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

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

эта возможность была вокруг с Javascript 1.3, согласно mozilla.org.

Примечание: В предыдущем ответе отсутствовал какой-то код. Теперь это исправлено + пример.


Мне нужно было что-то более гибкое для замены регулярного выражения, чтобы декодировать unicode в моих входящих данных 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"

используя 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;

если у вас будет переменное количество обратных ссылок, то счетчик аргументов (и места) также являются переменными. Элемент MDN Web Docs опишите следующий синтаксис для 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' здесь, потому что она имеет тип Arguments и нет типа Array Так что у него нет slice() метод.

Comments

    Ничего не найдено.