我有一个String,并希望将其替换为mssqlFunctions对象中给定的其他String。
var mssqlFunctions = {
DateDiff: "DATEDIFF",
Abs: "ABS",
y: 'year',
m: 'minute'
};
我的字符串是: DateDiff(m,Abs(23)[Emy()])
这是我替换String的代码
var regularExpression = new RegExp(Object.keys(mssqlFunctions).join("|"),"gi");
formula = formula.replace(regularExpression, function(matched){
return mssqlFunctions[matched];
});
因此它将输出指定为 DATEDIFF(minute,ABS(23)[Eminuteyear()])
但是我不想替换[]
中的字符串所以我想要的输出是
DATEDIFF(分钟,ABS(23)[Emy()])
答案 0 :(得分:4)
您可以匹配并捕获方括号之间的字符串,然后检查组是否匹配。如果组匹配,则匹配失败,并且您需要用整个匹配替换(放回去)。否则,您可以替换为修改后的值。
使用
var formula = "DateDiff(m, Abs(23)[Emy()])";
var mssqlFunctions = {
DateDiff: "DATEDIFF",
Abs: "ABS",
y: 'year',
m: 'minute'
};
var regularExpression = new RegExp("(\\[[^\\][]*])|" + Object.keys(mssqlFunctions).join("|"),"gi");
formula = formula.replace(regularExpression, function(matched, group1){
return group1 ? matched : mssqlFunctions[matched];
});
console.log(formula); // => DATEDIFF(minute, ABS(23)[Emy()])
(\\[[^\\][]*])|
是添加的regex替代分支。它匹配并捕获
\\[
-一个[
[^\\][]*
-除[
asnd ]
以外的0个字符以上]
-一个]
字符。 matched
变量代表整个比赛,group1
代表第1组比赛。 return group1 ? matched : mssqlFunctions[matched];
部分检查group1
是否匹配,如果是,则使用matched
替换匹配,否则检查mssqlFunctions[matched]
。
如果您想知道为什么要使用双反斜杠,请参见Why do regex constructors need to be double escaped?。