[[Value]除外的正则表达式

时间:2018-10-22 16:05:40

标签: javascript regex

我有一个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()])

1 个答案:

答案 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?