我想用正则表达式解析PHP代码,以找到我们的代码库中声明的所有顶级函数。
简单的:
^\s*function\s*([\w_-]+)\(工作得很好,但是捕捉到了额外的
class Foo {
function bar() {...}
}关于如何跳过没有作用域删除的非顶级函数,有什么想法吗?
注意:我知道,我知道,我应该使用真正的解析器,但我想要的是可以在一个非常大的代码库上运行在grep -R -P中的又快又脏的解析器。
发布于 2012-11-07 15:06:57
在缩进良好的代码库上,
^function\s*([\w_-]+)\(应该只捕获顶级函数。如果您希望使用前导空格,则可以对{使用zero-width negative look-behind,以避免在类声明的开头使用函数:
(?<!{)\s*function\s*([\w_-]+)\(发布于 2012-11-07 15:07:29
首先,我不得不说,这类东西在很大程度上取决于你的代码的纪律。对于我自己来说,我会在代码行的开头立即启动所有顶级函数。因此,如果我想找到非顶级函数(在vim中),我只需这样做
/^[[:space:]]\+function[[:space:]]\+\w\+\>和
/^function[[:space:]]\+\w\+\>用于所有顶级函数。
然而,正如我所说的,这取决于你的代码库的格式有多好。祝好运!
发布于 2012-11-07 16:07:45
如果你愿意使用ruby (或者基本上任何带有命名捕获组的东西),你可以使用类似这样的东西:
^\s*(?<type>\w+)\s*(?<name>[\w_-]+)(?<function>\([^()]*\))?\s*(?<body>{((?>[^{}]+)|(\g<body>))*})作为函数的函数将在function捕获组中有括号。那些是类不会的。
http://rubular.com/r/3dXZts6OYF
不过非常易碎。
https://stackoverflow.com/questions/13264693
复制相似问题