我有一条短信
name[one][1][two][45][text]
我使用此模式捕获文本"45"
/(.*?)rows][([0-9]*)(.*)/;
但是我怎样才能用任何其他数字替换唯一的 45?因为如果我使用相同的模式和替换方法,它会替换前一个单词。我的代码是
var name = "name[one][1][two][45][text]";
var pattern = /(.*?)two][([0-9]*)(.*)/;
var number = name.match(pattern);
number = parseInt(number[2]);
var replacePattern = /(.*?)two][([0-9]*)/;
var newName = name.replace(replacePattern, parseInt(number + 2));
console.log(newName);
但它返回了47][文本]
但是我怎样才能用任何其他数字替换唯一的 45?
您可以将替换函数与匹配的组一起使用:
例如 — 在这里我将45
替换为 7
:
"name[one][1][two][45][text]".replace(/(.*?)(two][)([0-9]*)(.*)/,function (a,b,c,d,e){
// replace 7 with what you want
return b+c+'7'+e;
})
结果:
"name[one][3][two][7][text]"
请注意,我添加了()
以包括稍后可以添加的其他部分。
编辑:关于您的实际示例(+=2):您可以这样做:
return b+c+(parseInt(d)+2)+e; -- to your actual example
如果您确定只有2
数字,那么
([0-9]+)(?!.*?d)
请参阅演示。
https://regex101.com/r/vH0sZ0/1
你可以这样做:
var name = "name[one][1][two][45][text]";
// pattern for matching 2 or more digits inside [ and ]
var pattern = /[([d]{2,})]/;
console.log(name.replace(pattern,"[47]");)
String.replace 允许将函数作为第二个参数,每个正则表达式匹配都会调用该参数。您可以在该函数中执行加法(或任何其他计算).
通过对正则表达式稍作修改,以不同的方式使用捕获组,您可以实现这一点 -试试这个——
name.replace(
/((?:.*?)two][)([0-9]*)(.*)/g,
function(e,p1,p2,p3){
//Adding the number with 2(As done in the question)
return p1+(parseInt(p2)+2)+p3
}
)
> "name[one][2][two][47][text]"
正则表达式演示