如何在Javascript中替换正则表达式的子字符串匹配?

143
var str   = 'asd-0.testing';
var regex = /asd-(\d)\.\w+/;

str.replace(regex, 1);

这会用1替换整个字符串str。我想替换匹配的子字符串而不是整个字符串。在JavaScript中是否有可能实现?


所有的解决方案都相当复杂。你只是想替换匹配,对吧?不需要修改你的正则表达式,可以这样轻松地实现:str.replace(regex, "$`1$'") 参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter - SgtPooki
6个回答

162
var str   = 'asd-0.testing';
var regex = /(asd-)\d(\.\w+)/;
str = str.replace(regex, "$11$2");
console.log(str);

或者如果你确定字符串中不会有其他数字:

var str   = 'asd-0.testing';
var regex = /\d/;
str = str.replace(regex, "1");
console.log(str);

2
'asd-0.testing'.replace(/(asd-)\d(.\w+)/, function(mystring, arg1, arg2){return arg1 + 'mynumber' + arg2}) - Ivan Rave
1
有没有一种答案,你不知道正则表达式的结构?在这里,你基本上是用两个匹配项创建一个新的正则表达式。 - Martin Massera
2
需要注意的是,你需要在想要作为 $1、$2 等的部分周围加上括号 ()。 - Bas Slagter

62

使用 str.replace(regex, $1);

var str   = 'asd-0.testing';
var regex = /(asd-)\d(\.\w+)/;

if (str.match(regex)) {
    str = str.replace(regex, "$1" + "1" + "$2");
}

编辑:根据评论进行调整


我想用“1”替换子字符串,而不是用子字符串替换整个字符串。 - dave

31

我会获取你想要替换的部分之前和之后的内容,并将它们放在两侧。

比如:

var str   = 'asd-0.testing';
var regex = /(asd-)\d(\.\w+)/;

var matches = str.match(regex);

var result = matches[1] + "1" + matches[2];

// With ES6:
var result = `${matches[1]}1${matches[2]}`;

6
我个人喜欢拥有一系列可以打开的火柴。 - eduncan911
我同意,我认为拥有匹配的集合更易读。 - Travis J

6
我认为实现您的目标最简单的方法是这样的:
var str   = 'asd-0.testing';
var regex = /(asd-)(\d)(\.\w+)/;
var anyNumber = 1;
var res = str.replace(regex, `$1${anyNumber}$3`);

2
基于@Greg7000的答案,这是一个基于替换方法的“一句话”。
'asd-0.testing'
  .replace(
    /(asd-)\d(\.\w+)/,
    (match: string, p1: string, p2: string) => { 
      return `${p1}1${p2}`; 
    });

1
就个人而言,我喜欢替换技术所提供的自由(请搜索“将函数指定为替换项”部分)。这也更容易进行详细的调试。
function replacer(match, p1, p2, offset, string) {
    console.log('match = ' + match);
    console.log('p1 = ' + p1);
    console.log('p2 = ' + p2);
    console.log('offset = ' + offset);
    console.log('string = ' + string);
    custom_op = p1 + 1 + p2;

    return custom_op;
}

var str = 'asd-0.testing';
var regex = /(asd-)\d(\.\w+)/;

matches = str.match(regex)

res = str.replace(regex, replacer);
console.log(res);

// ----OUTPUT----
// match = asd-0.testing
// p1 = asd-
// p2 = .testing
// offset = 0
// string = asd-0.testing
// asd-1.testing

注意:为了方便识别正则表达式组,请考虑使用https://regex101.com/

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