我正在尝试用JavaScript中相同数量的虚拟字符替换部分字符串,例如:'== Hello =='with'== ~~~~~ =='。
此问题已使用Perl和PHP得到解答,但我无法在JavaScript中使用它。我一直在尝试这个:
txt=txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3");
模式匹配工作正常,但替换没有 - 第二部分添加'~~'而不是模式匹配的长度。将“$ 2”放在括号内是行不通的。我该怎么做才能插入正确数量的字符?
答案 0 :(得分:7)
使用替换功能:
var txt = "==Hello==";
txt = txt.replace(/(==)([^=]+)(==)/g, function ($0, $1, $2, $3) {
return $1 + (new Array($2.length + 1).join("~")) + $3;
});
alert(txt);
//-> "==~~~~~=="
答案 1 :(得分:1)
在$ 2替换之前正在评估length属性,因此replace()将不起作用。 Augustus建议的函数调用应该有效,另一种方法是使用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(/(^==)(.+)(==$)/)
答案 2 :(得分:0)
working sample使用以下片段:
var processed = original.replace(/(==)([^=]+)(==)/g, function(all, before, gone, after){
return before+Array(gone.length+1).join('~')+after;
});
代码中的问题是你总是测量"$2"
的长度(总是一个包含两个字符的字符串)。通过该功能,您可以测量匹配零件的长度。有关更多示例,请参阅documentation on replace。
答案 3 :(得分:0)
表达式问题
txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3")
是"$2".length
强制$2
被当作字符串文字,即长度为2的字符串"$2"
。
来自MDN docs:
由于我们要在进行最终替换之前进一步转换匹配项的结果,因此必须使用一个函数。
这将强制在转换之前评估匹配项。
以内联函数作为参数(和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)
);