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

Vis*_*esh 5 javascript regex

我有一个字符串,并希望将其替换为mssqlFunctions对象中给出的其他字符串.

var mssqlFunctions = {
                DateDiff: "DATEDIFF",
                Abs: "ABS",
                y: 'year',
                m: 'minute'
            };
Run Code Online (Sandbox Code Playgroud)

我的字符串是:DateDiff(m,Abs(23)[Emy()])

这是我替换String的代码

var regularExpression = new RegExp(Object.keys(mssqlFunctions).join("|"),"gi");

formula = formula.replace(regularExpression, function(matched){
  return mssqlFunctions[matched];
});
Run Code Online (Sandbox Code Playgroud)

因此它将输出作为DATEDIFF(分钟,ABS(23)[Eminuteyear()])

但我不想替换[]中的字符串

所以我想要的输出是

DATEDIFF(分钟,ABS(23)[Emy()])

Wik*_*żew 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()])
Run Code Online (Sandbox Code Playgroud)

(\\[[^\\][]*])|是添加的正则表达式替代分支。它匹配并捕获

  • \\[- A[
  • [^\\][]*- 除[asnd之外的 0+ 个字符]
  • ]- 一个]字符。

matched变量代表整场比赛,group1代表第 1 组比赛。该return group1 ? matched : mssqlFunctions[matched];部分检查是否group1匹配,如果是, matched则用于替换匹配项,否则mssqlFunctions[matched]

如果您想知道为什么使用双反斜杠,请参阅为什么正则表达式构造函数需要双转义?