Javascript 用于字符串中匹配计算的正则表达式
我有一个函数,可以获取字符串,将其解释为计算并返回计算结果,有效计算的示例如下:Javascript 用于字符串中匹配计算的正则表达式,javascript,regex,Javascript,Regex,我有一个函数,可以获取字符串,将其解释为计算并返回计算结果,有效计算的示例如下: 3(log(e+pi^(22/3))) 44+3*(pi+2)/root(7) 这个函数很重,所以我只想在字符串实际上是一个计算时运行它。在添加log和root、pi和e以及隐式乘法等函数之前,我使用了以下正则表达式: /^((-?([0-9]+?\.)?[0-9]+?)\s?([+\-*\/%^]|(\*\*))\s?)+?(-?([0-9]+?\.)?[0-9]+?)$/ 这已经不起作用了。在这一点上,我甚
3(log(e+pi^(22/3)))
44+3*(pi+2)/root(7)
这个函数很重,所以我只想在字符串实际上是一个计算时运行它。在添加log和root、pi和e以及隐式乘法等函数之前,我使用了以下正则表达式:
/^((-?([0-9]+?\.)?[0-9]+?)\s?([+\-*\/%^]|(\*\*))\s?)+?(-?([0-9]+?\.)?[0-9]+?)$/
这已经不起作用了。在这一点上,我甚至不确定正则表达式在性能方面是否有意义。我预计大约有0.1%的字符串匹配(这是一个有效的计算)
你对如何创建一个表现良好的常规团队有什么想法吗
表达式(函数本身决定其是否有效
计算本身,但需要很长时间,因此没有100%的准确性
需要)或验证计算的函数
你问的问题本质上是。
IMHO,您的字符串计算可以构建为语法树。为它构建一个解析器要比创建一个相当复杂的正则表达式容易得多。我编写了一个验证计算的函数,下面是代码:
const isValidCalc = (calc) => {
contains = {
br: false,
num: false,
let: false,
op: false,
}
let prev;
let level = 0;
return ![...calc.replace(/\*\*/g, "^").replace(/ /g, "").replace(/e/g, Math.E).replace(/pi/g, Math.PI)].some(el => {
if (el === "(") {
prev = "open";
level++;
return false;
};
if (el === ")") {
if (level-- === 0 || prev === "letter") return true;
prev = "close";
contains.br = true;
return false;
}
if (_.is.Operation(el)) {
if (prev === "operator" || prev === "letter") return true;
prev = "operator";
contains.op = true;
return false;
}
if (_.is.Numeric(el) || el === ".") {
if (prev === "close" || prev === "letter") return true;
prev = "numeric"
contains.num = true;
return false;
}
if (_.is.Letter(el)) {
prev = "letter"
contains.let = true;
return false;
}
return true;
}) && level === 0 && contains.num && (!contains.let || contains.br) && (contains.let || contains.op);
};
正如您的链接所示,不可能将任意嵌套的括号与正则表达式匹配。@msw好吧,关键是我认为一个复杂的正则表达式不足以完成这项任务。但是仍然有一些使用正则表达式的空间。例如,如果计算表达式的某些模式在数据库中非常常见,则可以将多个正则表达式组合在一起,并使用它们作为解析器的一部分。检查这个[,它用几个已知模式的正则表达式替换了解析器的一些函数。