如何用regexp替换圆括号内的每个逗号



我有一个字符串:

"a: a(1, 2, 3), b: b(1, 2)"

需要用一个_替换圆括号内的每个,。我期待看到:

"a: a(1_ 2_ 3), b: b(1_ 2)"

现在我使用它,但只替换了括号中的第一个逗号,而不是全部:

let string = "a: a(1, 2, 3), b: b(1, 2)";
string = string.replace(/(()([d.-s]+)(,)([d.-s]+)())/g, '$1$2_$4$5');
// a: a(1_ 2, 3), b: b(1_ 2)

您可以使用基于前瞻的regex:

str = str.replace(/,(?=[^()]*))/g, '$&_')

RegEx演示

var str = "a: a(1, 2, 3), b: b(1, 2)"
str = str.replace(/,(?=[^()]*))/g, '$&_')
console.log(str)

RegEx详细信息:

  • ,:匹配逗号
  • (?=[^()]*)):Positive Lookahead,断言在匹配其间的任何()之前,我们没有闭合的)
  • $&_:$&是完全匹配的反向引用,我们在末尾添加一个文本_

我们可以使用正则表达式替换回调函数:

var input = "a: a(1, 2, 3), b: b(1, 2)";
var output = input.replace(/(d+(?:, d+)*)/g, (match, startIndex, wholeString) => {
return match.replace(/,/g, "_");
});
console.log(input);
console.log(output);

这里的想法是使用以下regex模式匹配每个元组:

(d+(?:, d+)*)

然后,我们将每个匹配传递给回调函数,然后回调函数对,进行全局替换,以替换为_

最新更新