繁体   English   中英

Javascript正则表达式 - 用相同数量的另一个字符替换字符序列

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

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

使用PerlPHP已经回答了这个问题,但我无法在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);
//-> "==~~~~~=="

在$ 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(/(^==)(.+)(==$)/)

表达式的问题

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) ); 

工作示例使用以下片段:

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

你的代码中的问题是你总是测量"$2"的长度(总是一个包含两个字符的字符串)。 通过该功能,您可以测量匹配零件的长度。 有关更多示例,请参阅有关替换文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM