JavaScript - 字符串正则表达式反向引用

101

在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"));
5个回答

124

像这样:

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

1
太棒了,我在哪里可以找到更多关于这个的信息? - quano
9
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace - SLaks
11
酷。澄清一下:$1$2在这里是用户选择的参数名称(选择模仿反向引用符号);这些参数的数量因正则表达式中捕获组的数量而异。 - mklement0

39

将一个函数作为第二个参数传递给replace方法:

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

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

根据mozilla.org的介绍,自Javascript 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数据中的Unicode:

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 Web Docs描述了指定函数作为替换参数的以下语法:
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() 方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接