【问题标题】:Regular expression to match all javascript functions匹配所有javascript函数的正则表达式
【发布时间】:2017-08-16 16:37:08
【问题描述】:

大约一个月前,我想组织我所有的 javascript 函数以按字母顺序排列它们,而今天我正在玩一个正则表达式,这让我再次想到了这一点。我只想匹配外部函数以避免嵌套函数被移动并且我认为几乎已经有了它,但是我缺少一些东西。

我在此页面上使用了泡泡泡泡的答案作为起点。 Regular Expression to match outer brackets

function\s.*\(.*\).*\{(?>[^.*\n*]+|(?R))*\}

这将匹配所有函数定义并捕获直到第一个花括号的参数。出于某种原因,当它是表达式的一部分时,我无法让它与换行符模式 [^.*\n*]+ 匹配,但当它完全单独时,它匹配得很好。

我使用 Sublime 文本编辑器作为我的搜索工具,但它最终会出现在一个 JS 文件中,这可能是一种操作代码的简单方法。

【问题讨论】:

  • “按字母顺序排列”——这真是个糟糕的主意。订单必须是语义驱动的。无论如何,如果你想正确地解决它 - 使用任何 JS 语法解析器,它会更容易和更可靠 100 倍。
  • 您将不得不寻找新的线路。 \nfunction.*?\n\}这可能是它...

标签: javascript regex pcre


【解决方案1】:

经过一天的摆弄,这里有一个正则表达式,它将分解一个 js 文件以匹配所有命名函数,然后将其分解为函数名、参数和主体。与 Floribon 的解决方案不同,这将匹配任何格式样式,甚至是缩小格式,并忽略嵌套的大括号和函数。

function\s+(?<functionName>\w+)\s*\((?<functionArguments>(?:[^()]+)*)?\s*\)\s*(?<functionBody>{(?:[^{}]+|(?-1))*+})

https://regex101.com/r/sXrHLI/1

【讨论】:

  • 我不同意它会匹配任何格式样式。不匹配函数表达式*除非命名)并且不匹配箭头函数等等。 Few sample cases
  • “前面的标记不可量化”将“Flavor”更改为 Javascript 时抛出错误。我想知道这是否与 Javascript 回溯的限制有关?
【解决方案2】:

这似乎与我的所有函数及其主体相匹配(单行定义的函数除外,这需要额外的表达式)

function.*\(.*\).*\{(.|\n)*?\n\}

或者如果你不想捕捉身体,只需添加?:

function.*\(.*\).*\{(?:.|\n)*?\n\}

我们的想法是匹配,直到我们以一个新行和一个右花括号结束:这样,正文中的任何括号(或内部函数)都不会与我们的搜索发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2018-07-14
    • 2011-11-29
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多