【问题标题】:i have regex pattern on my javascript code and why is to slow?我的 javascript 代码上有正则表达式模式,为什么会变慢?
【发布时间】:2021-03-29 00:57:41
【问题描述】:

我的 javascript 代码中有两个正则表达式

const regex = /[0-9a-zA-Z_ ]{3,}/gm;
const htmlRegex = /\r\n|\n|\r|&nbsp;|<[^>]*>/gm;

第一个正则表达式用于检查字符串是否存在 3 位数字,第二个正则表达式用于检查字符串是否包含 html 代码。但是这个正则表达式很慢需要 1-2 秒。

如何解决这个问题?之前谢谢。

【问题讨论】:

  • 请重新考虑使用正则表达式检测html?
  • 您还有其他解决方案吗? @evolutionxbox
  • 抱歉,我将“检测”误解为“解析”。这个问题有帮助吗? stackoverflow.com/questions/15458876/…
  • 你在什么样的输入上运行它,以及如何,所以它需要“1-2秒[s]”?如果他们只是检查存在,为什么他们有g 标志?
  • 这个正则表达式 [0-9a-zA-Z_ ]{3,} 匹配任何列出的 3 次或更多次,也可以匹配 3 个空格。要匹配 3 位数字,您可以使用 \d{3} 在第二个模式中,您可以将交替缩短为 \r?\n|&amp;nbsp;|&lt;[^&gt;]*&gt;

标签: javascript node.js regex performance


【解决方案1】:

关于正则表达式模式

  • [0-9a-zA-Z_ ]{3,} 是完全未锚定的,它可以匹配字符串的任何位置,正则表达式引擎将尝试尽可能多地找到 3 个或更多的字母数字或下划线或空格字符。一旦找到部分匹配,例如 1 或 2 个这样的字符,它将失败并继续从下一个位置搜索模式。对于没有匹配项的较长字符串,这可能会导致性能下降。像这样改进模式并不容易,尤其是在不知道确切要求的情况下。在大多数情况下,您只需要找出左侧边界并尝试尽可能精确。比如说,如果您希望匹配以单词 char 开头,您可以使用 \w[\w ]{2,}(注意 \w = [0-9a-zA-Z_])。
  • \r\n|\n|\r|&amp;nbsp;|&lt;[^&gt;]*&gt; 不是最佳选择,因为 \r\n\r 替代方案可以在字符串中的相同位置开始匹配。它增加了回溯步骤。解决这个问题的最佳方法是确保不同的替代方案在相同的位置不匹配,例如\r\n?|\n|&amp;nbsp;|&lt;[^&gt;]*&gt;

关于代码,如果您只是想检查是否在字符串中找到匹配项,则应考虑使用RegExp.test()。为了使其正常工作,您需要删除 g 标志。请注意,m 标志在您的正则表达式中是多余的,因为您不使用 ^$。所以,你的支票看起来像/\r\n?|\n|&amp;nbsp;|&lt;[^&gt;]*&gt;/.test(string)

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2015-02-11
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2015-07-21
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多