Как получить значение в $ 1 в регулярном выражении для переменной для дальнейших манипуляций [duplicate]

Javascript всегда pass-by-value , все имеет тип значения. Объекты являются значениями, функции-члены объектов сами являются значениями (помните, что функции являются первоклассными объектами в Javascript). Кроме того, в отношении концепции, что все в Javascript является объектом , это неверно. Строками, символами, числами, булевыми значениями, нулями и неопределенными являются примитивы . Иногда они могут использовать некоторые функции-члены и свойства, унаследованные от их базовых прототипов, но это только для удобства, это не значит, что они сами объекты. Попробуйте следующее для справки

x = "test";
alert(x.foo);
x.foo = 12;
alert(x.foo);

В обоих предупреждениях вы найдете неопределенное значение.

76
задан quano 15 March 2010 в 15:50
поделиться

5 ответов

Нравится это:

str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })
105
ответ дан SLaks 22 August 2018 в 19:33
поделиться
  • 1
    Удивительно, где я могу найти дополнительную информацию об этом? – quano 15 March 2010 в 15:54
  • 2
    [Д0] developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… – SLaks 15 March 2010 в 15:55
  • 3
    Круто. Чтобы уточнить: $1 и $2 - это имена пользователей, выбранные пользователем (выбранные для имитации символов обратной ссылки); меняются! - число этих параметров соответствует количеству групп захвата в регулярном выражении. – mklement0 1 May 2013 в 23:48

Если у вас будет переменное количество обратных ссылок, количество аргументов (и мест) также будет переменной. MDN Web Docs описывают синтаксис 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», потому что она имеет тип Arguments и no типа Array, поэтому у нее нет метода slice().

0
ответ дан 7ochem 22 August 2018 в 19:33
поделиться

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


Мне понадобилось что-то более гибкое для замены регулярного выражения для декодирования юникода в моих входящих данных 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"
0
ответ дан Jacksonkr 22 August 2018 в 19:33
поделиться

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

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

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

Эта возможность существует со времен Javascript 1.3, согласно mozilla.org .

28
ответ дан Sean 22 August 2018 в 19:33
поделиться

Использование 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
ответ дан vdegenne 22 August 2018 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: