正则表达式在javascript源代码中匹配函数?

时间:2009-07-08 15:23:09

标签: javascript regex

有没有办法使用正则表达式匹配javascript源代码中的功能块?

(我真的想找到相反的,但我认为这将是一个很好的起点。)

6 个答案:

答案 0 :(得分:6)

我有一个非常有效的javascript解决方案,与所有人的信仰相反...尝试这个,我已经使用过它并且效果很好 function\s*([A-z0-9]+)?\s*\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\{(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\}

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

答案 1 :(得分:5)

有一些事情,正则表达式不是很擅长。这并不意味着构建一个可行的表达式是不可能的,只是它可能不太合适。其中包括:

  • 多行输入
  • 嵌套

Javascript功能块往往覆盖多行,您将要找到匹配的“{”和“}”括号,表示块的开始和结束,可以嵌套到未知深度。您还需要考虑评论中使用的潜在大括号。 RegEx将为此感到痛苦。

但这并不意味着它是不可能的。您可能有关于您正在寻找的功能的性质的其他信息。如果您可以执行诸如保证注释中没有大括号并将嵌套限制到特定深度的事情,您仍然可以构建表达式来执行此操作。它会有点混乱,难以维护,但至少在可能的范围内。

答案 2 :(得分:5)

不是,不。

功能块不是常规的,因此正则表达式不适合作业。请参阅,为了捕获JS中的功能块,您需要计算{的实例并将它们与}的实例进行平衡,否则您将匹配太多或太少。正则表达式不能进行这种计数。

只需读入您正在尝试查看的文件并递归管理嵌套。从概念上讲,这种方式非常容易管理。

答案 3 :(得分:3)

不,这是不可能的。正则表达式不能匹配嵌套的字符对。所以这样的事情会欺骗它:

function foo() {
    if(bar) {
        baz();
    } // oops, regex would think this was end of function
}

但是,您可以创建一个相当简单的语法(EBNF-ish形式):

javascript_func
: "function" ID "(" ")" "{" body* "}"
| "function" ID "(" params ")" "{" body* "}"
;

params
: ID
| params "," ID

body
: [^{}]* // assume this is like a regex
| "{" body* "}"
;

哦,这也是假设你有某种词法分析器来删除空格和评论。

答案 4 :(得分:3)

一些正则表达式引擎确实允许递归。用PHP或PCRE说,你可以像这样得到嵌套括号:

{(?:[^{}]+|(?R))*+}

?R“粘贴”整个表达式。捕获函数子组将更有用:

function[^{]+({(?:[^{}]+|(?-1))*+})

然后我们可能想要过滤掉任何破坏括号的注释(需要sm标志):

function\s+\w+\s*\([^{]+({(?:[^{}]+\/\*.*?\*\/|[^{}]+\/\/.*?$|[^{}]+|(?-1))*+})

这适用于基本情况。但是仍然存在带有'}'的字符串,带有转义引号的字符串以及其他需要担心的事情。

以下是演示:https://regex101.com/r/fG4gO1/2

答案 5 :(得分:2)

经过一天为我自己的项目摆弄它之后,这里有一个正则表达式,它将分解一个js文件以匹配所有已命名的函数,然后将其分解为函数名,参数和正文。

std::ustring

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