Javascript Regex-用相同数量的另一个字符替换字符序列

Javascript Regex- replace sequence of characters with same number of another character

本文关键字:字符 另一个 替换 Regex- Javascript      更新时间:2023-09-26

我试图用JavaScript中相同数量的虚拟字符替换字符串的一部分,例如:'==Hello=='与'==~~~~~=='.

这个问题已经用Perl和PHP回答了,但是我不能让它在JavaScript中工作。我一直在尝试这个:

txt=txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3");

模式匹配工作得很好,但是替换不是——第二部分添加'~~'而不是模式匹配的长度。把"$2"放在括号里是行不通的。我怎么做才能使它插入正确数量的字符?

使用函数代替:

var txt = "==Hello==";
txt = txt.replace(/(==)([^=]+)(==)/g, function ($0, $1, $2, $3) {
    return $1 + (new Array($2.length + 1).join("~")) + $3;
});
alert(txt);
//-> "==~~~~~=="

表达式

的问题
txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3") 

表示"$2".length强制$2作为字符串字面值,即长度为2的字符串"$2"

从MDN文档:

因为要在最后的替换之前进一步转换匹配的结果,所以必须使用函数。

这强制在转换之前对匹配进行评估。

使用内联函数作为参数(和repeat)—这里$1, $2, $3是局部变量:

txt.replace(/(==)([^=]+)(==)/g, (_,$1,$2,$3) => $1+'~'.repeat($2.length)+$3);

txt = '==Hello==';
//inline function
console.log(
  txt.replace(/(==)([^=]+)(==)/g, (_, g1, g2, g3) => g1 + '~'.repeat(g2.length) + g3)
);

长度属性是在$2替换之前计算的,因此replace()不起作用。奥古斯都建议的函数调用应该可以工作,另一种方法是使用match()而不是replace()。

使用不带/g的match(),返回一个匹配结果数组,这些结果可以按照您的期望进行连接。

txt="==Hello==";
mat=txt.match(/(==)([^=]+)(==)/);  // mat is now ["==Hello==","==","Hello","=="]
txt=mat[1]+Array(mat[2].length+1).join("~")+mat[3]; // txt is now "==~~~~~=="

你从中间的表达式中排除了开头/结尾字符,但是如果你想要更多的灵活性,你可以使用它来处理任何被开头/结尾文字括起来的东西。

mat=txt.match(/(^==)(.+)(==$)/)

一个工作示例使用以下片段:

var processed = original.replace(/(==)([^=]+)(==)/g, function(all, before, gone, after){
    return before+Array(gone.length+1).join('~')+after;
});

你的代码中的问题是你总是测量"$2"的长度(总是一个有两个字符的字符串)。有了这个函数,你就可以测量匹配部分的长度。有关更多示例,请参阅replace文档。

相关文章: