javascript - 当字符串包含特殊字符时,正则表达式查询速度变慢

标签 javascript regex

我有一个正则表达式,如下 /^(\s*\(*\s*[0-9]*\s*[+\-*/]?\s*[0-9]*\s*\)*\s*)*$/ 它并不完美,但它被设计为快速检查输入的字符串是否是基本数学公式,例如,7 * 9 * (6 + 5)。我会进行二次检查是否通过以查找未闭合的括号(该公式也允许以运算符结尾)。

Javascript 的 String.prototype.match 能够使用正则表达式非常快速地匹配某些字符串,例如,"7 * 912 + 6 + 7 +".match(regex) - 但与其他人相比非常慢:

  1. "7 * 912 + 6 + $ +".match(正则表达式)
  2. "7 * 912 + 6 + ^ +".match(正则表达式)
  3. "7 * 912 + 6 + [ +".match(正则表达式)
  4. "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/

相关文章:

javascript - .val ("value") 在 jQuery 1.5 中没有按预期工作

python - 正则表达式查找子字符串并替换字符并更新整个字符串

python - 如何获得与python的最短匹配(复杂的非贪婪模式)

java - 替换字符串中的数字

regex - 如何使用 grep 和 regex 来匹配特定长度的单词?

javascript - 如何使用 JSON asp.net MVC 同时发送两个数组以进行查看

javascript - Meteor 中的全局变量

javascript - 构建 react 应用程序的版本,提供指向 CSS 和 JS 文件的错误链接

javascript - 使用 JQuery/JavaScript 下载最新版本的页面?

php - 检查字符串是否只包含php中的数字