Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于字符串中匹配计算的正则表达式_Javascript_Regex - Fatal编程技术网

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好吧,关键是我认为一个复杂的正则表达式不足以完成这项任务。但是仍然有一些使用正则表达式的空间。例如,如果计算表达式的某些模式在数据库中非常常见,则可以将多个正则表达式组合在一起,并使用它们作为解析器的一部分。检查这个[,它用几个已知模式的正则表达式替换了解析器的一些函数。