我有一个正则表达式,如下 /^(\s*\(*\s*[0-9]*\s*[+\-*/]?\s*[0-9]*\s*\)*\s*)*$/
它并不完美,但它被设计为快速检查输入的字符串是否是基本数学公式,例如,7 * 9 * (6 + 5)
。我会进行二次检查是否通过以查找未闭合的括号(该公式也允许以运算符结尾)。
Javascript 的 String.prototype.match
能够使用正则表达式非常快速地匹配某些字符串,例如,"7 * 912 + 6 + 7 +".match(regex)
- 但与其他人相比非常慢:
"7 * 912 + 6 + $ +".match(正则表达式)
"7 * 912 + 6 + ^ +".match(正则表达式)
"7 * 912 + 6 + [ +".match(正则表达式)
"7 * 912 + 6 + ] +".match(正则表达式)
但是对于以下情况来说速度很快:"7 * 912 + $ +".match(regex)
大概的原因是该字符串包含特殊字符,与 ? 结合使用。在中间(如果我删除它,问题就会消失) - 但只有当一定数量的运算符组合在一起时?有没有办法提高这个性能?现在我只是预先检查是否有任何特殊字符(因为无论如何都不允许使用),但我想要更干净的东西。
最佳答案
检测格式良好的表达式非常复杂 - 我不会尝试使用单个正则表达式来完成整个事情 - 我会将您的多次传递方法扩展到满足您的需求所需的级别。我肯定会从基本的字符过滤器开始:
var charRegex = /[^0-9+\-*\(\)\s]/i;
function testString(str) {
if (!charRegex.test(str)) {
// fail
return false;
}
// do further tests...
}
您的进一步测试可能包括正则表达式来测试连续的多个运算符、未闭合的括号等。如果您在函数内执行此操作,则可以在第一次失败的测试时提前返回。
要真正完全做到这一点,我认为您需要某种递归函数,而不是对整个字符串进行一系列测试。但如果您不想走那么远,我认为一系列更简单的正则表达式可能足以满足您的需求。
关于javascript - 当字符串包含特殊字符时,正则表达式查询速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649715/