您可以在JavaScript中进行反向引用:
var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");
这会(非常愚蠢)将“$ test”替换为“test”。但想象一下,我想将结果字符串$ 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"));
答案 0 :(得分:111)
像这样:
str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })
答案 1 :(得分:32)
将函数作为第二个参数传递给replace
:
str = str.replace(/(\$)([a-z]+)/gi, myReplace);
function myReplace(str, group1, group2) {
return "+" + group2 + "+";
}
根据mozilla.org,此功能自Javascript 1.3以来就已存在。
答案 2 :(得分: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;
&#13;
答案 3 :(得分:0)
注意:以前的答案缺少一些代码。它现在已修复+示例。
我需要一些更灵活的正则表达式替换来解码传入的JSON数据中的unicode:
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"
答案 4 :(得分: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()
方法。