【问题标题】:Avoiding Backtracking with Javascript Regex使用 Javascript 正则表达式避免回溯
【发布时间】:2015-09-08 15:04:36
【问题描述】:

我正在开发 JavaScript 中的函数解析器,它大致要求以下条件为真,才能将文本序列视为函数:

  • 包含驼峰式名称(以非数字的小写字符开头)
  • 可以有参数(如果没有参数,括号是可选的)
  • 参数名称需要与函数名称具有相同的属性,并且可以有多个参数,以逗号分隔
  • 返回变量名是可选的,可以在函数定义后用'->'指定(即 someFunc(var1)->retVal 或 someFunc->retVal。它们需要与函数名具有相同的属性。李>

现在假设我得到一个包含函数定义(一些有效,一些无效)的文本字符串,如下所示:

somefunc(var1,var2),SomeFunc,somefunc()->RetVal,somefunc()->retVal,somefunc->retVal

这可以使用以下正则表达式进行解析:

((?:\b[a-z]\w*)\(?(?:[a-z]\w*,?)*\)?(?:->[a-z]\w*)?(?=,|$))+

从中提取以下函数定义:

  • somefunc(var1,var2)
  • somefunc()->retVal
  • somefunc->retVal

现在,尽管我的正则表达式工作正常,但我相信基于使用 this 正则表达式测试网站的一些调试,我可能会遇到一些回溯问题。例如,我相信当正则表达式在上面的字符串中命中 SomeFunc 时,会发生很多回溯。

有没有办法优化这个正则表达式?如果是这样,将来我可以将任何准则应用于我的正则表达式,以提高它们的效率吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    用 RegEx 解析通常是个坏主意。 RegEx 不是为解析而设计的,它是为搜索和匹配而设计的。正因为如此,它在解析方面非常糟糕(而且效率低下)。

    您似乎正在尝试生成文档?您是否考虑过使用JSDoc?这是一种编写 JS cmets 的方式,可以为您生成文档。也有代码编辑器 (WebStorm) 可以为您生成实际的 cmets。

    很抱歉,如果这不是您想听到的,但是当我尝试做同样的事情时,它帮助了我。 :)

    【讨论】:

    • 我正处于开发的早期阶段,所以我还没有记录任何代码(实际上还没有任何代码可以记录:D)。无论如何,感谢您的提示。至于我最初的问题,您不建议使用 RegEx 来提取组吗?我应该只使用 JavaScript 中的字符串函数来提取函数定义吗?
    • 不客气!不,我个人不会将它用于团体。如果您确定它们都将用逗号分隔,则可以使用split() 轻松获取定义数组。这是一个示例:jsfiddle.net/0tdgqLdb
    • 是的,这就是我根据您的回答计划的方向。看起来字符串的某些部分取决于其他部分,这可能意味着我需要一个 CFG 解析器。谢谢你的第二双眼睛!
    • 投反对票的人:请解释你的理由,以便改进帖子。
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多