我正在研究一个庞大且非常混乱的javascript文件,我想从文件中删除所有函数,最终创建一个只包含数据的版本。
代码看起来像这样:
var foo : bar = "hi";
function foobar (){
//blah blah
}
var fobar:bar;
var barfo:bar;
function imSoUgly(){
//Blah blah blah blah mr freeman
}
我想构建的正则表达式会找到所有函数。{。}并删除它们,产生这个:
var foo : bar = "hi";
var fobar:bar;
var barfo:bar;
我不太确定从哪里开始。理想情况下,我想用Textmate的RegEx来做,但我很容易。
答案 0 :(得分:3)
我不认为只用正则表达式就可以做到这一点,因为不可能匹配可以任意深度嵌套的起始和结束括号(代码块)。
为了可靠地执行此操作,您需要递归查看所有内部代码代码块以找到函数的结尾。或类似的东西(计算括号的数量,......)。
答案 1 :(得分:1)
你做不到。话虽这么说你可以使用这样的东西
function\s+\w+\s*\([^)]*\)\s*{[^}]*}
但如果函数中有任何{
或}
并且您无法对此做任何事情,它将会失败
答案 2 :(得分:0)
- 已删除 - Carko是对的,正则表达式是解决问题的一种非常天真的方法。
你需要PEG。
答案 3 :(得分:0)
在我看来,正则表达式不足以做一些像这样复杂的事情。我能用正则表达式做的最好的就是:
[\r\n]function [\w ]*\(\)\{[\w\W]*?}
这会删除你示例中的所有函数,但如果你有这样的东西,那就行不通了:
function foobar (){
if(condition){
// do something
} // this end brace would be mis-interpreted as the end of the function
// bla, bla, bla
}
你仍然会:
// bla, bla, bla
}
悲观主义者的回答是可行的,但只有在结束行之前所有函数都没有空格的情况下,这是不可能的。
最重要的是,你真的需要一个真正的JavaScript解析器。快速谷歌搜索发现了这个:
答案 4 :(得分:0)
您无法使用“常规”表达式执行此操作,但某些语言提供了模式匹配结构,允许您匹配(除其他外)平衡文本。
例如,Perl:
/function\s*\(\)\s*(\{([^{}]++|(?1))*\}/
这是否是工作的正确工具(提示:可能不是)完全是另一个问题。