我有一个字符串:
"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+)*)
然后,我们将每个匹配传递给回调函数,然后回调函数对,
进行全局替换,以替换为_
。