Javascript 字符串包含特殊字符时的慢速正则表达式查询
我有一个正则表达式,如下所示/^\s*\*\s*[0-9]*\s*[+\-*/]?\s*[0-9]*\s*\*\s**$/它不是完美的,但它被设计为一个快速检查输入的字符串是否是一个基本的数学公式,例如7*9*6+5。我做了二次检查,如果这通过寻找未闭合的括号,公式也可以在运算符上结束 Javascript的String.prototype.match能够使用正则表达式非常快速地匹配某些字符串,例如7*912+6+7+.matchregex,但与其他字符串相比速度非常慢: 7*912+6++$+.matchregex 7*912+6+^+.matchregex 7*912+6++.matchregex 7*912+6++.matchregex 但是,对于:7*912++$+.matchregex,它的速度很快Javascript 字符串包含特殊字符时的慢速正则表达式查询,javascript,regex,Javascript,Regex,我有一个正则表达式,如下所示/^\s*\*\s*[0-9]*\s*[+\-*/]?\s*[0-9]*\s*\*\s**$/它不是完美的,但它被设计为一个快速检查输入的字符串是否是一个基本的数学公式,例如7*9*6+5。我做了二次检查,如果这通过寻找未闭合的括号,公式也可以在运算符上结束 Javascript的String.prototype.match能够使用正则表达式非常快速地匹配某些字符串,例如7*912+6+7+.matchregex,但与其他字符串相比速度非常慢: 7*912+6++$+
大概原因是字符串包含特殊字符,并与?在中间,如果我删除这个问题,问题就消失了,但是只有当一定数量的操作符组合在一起时,问题才会消失。有什么方法可以提高此功能的性能吗?现在我只是在预先检查是否有任何特殊的字符,因为无论如何都不允许,但我想要更干净的 检测一个格式良好的表达式相当复杂-我不会尝试使用单个正则表达式来完成整个过程-我会将您的多重过程方法扩展到满足您需要的级别。我肯定会从一个基本的字符过滤器开始:
var charRegex = /[^0-9+\-*\(\)\s]/i;
function testString(str) {
if (!charRegex.test(str)) {
// fail
return false;
}
// do further tests...
}
进一步的测试可能包括用于测试一行中多个运算符的正则表达式、未闭合的括号等。如果在函数中执行此操作,则可以在第一次失败的测试中提前返回
要完全做到这一点,我认为您需要某种递归函数,而不是对整个字符串进行一系列测试。但如果您不想走那么远,我认为一系列简单的正则表达式可能足以满足您的需要。有关验证基本数学输入的信息,请参阅我的答案。虽然它不处理括号,但您可以轻松添加基本的可选括号检查和可选空格。@MonkeyZeus您的答案不会有同样的问题吗?如果我理解正确的话,…+*的组合似乎是个问题。它不是完美的,它是可怕的。永远不要使用带有*量词的可选模式,这些量词可能在字符串中的同一位置匹配。关于灾难性回溯:@WiktorStribiżew-指的是正确性,而不是性能-我知道性能很糟糕:无论如何,我必须评估整个公式,所以也许我不必担心正则表达式,我有一个递归函数,它对公式求值,并在NaN或运算符没有两个操作数时失败。我只是希望正则表达式能够更快地执行递归中的高通检查,每个表达式要么只是一个数字,要么有[expression]运算符[expression]。我认为正则表达式在递归的这些步骤中可能是可用的。