正则表达式从js文件中删除所有函数[Textmate preferred]

时间:2010-06-28 01:04:00

标签: javascript regex textmate

我正在研究一个庞大且非常混乱的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来做,但我很容易。

5 个答案:

答案 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解析器。快速谷歌搜索发现了这个:

http://www.antlr.org/

答案 4 :(得分:0)

您无法使用“常规”表达式执行此操作,但某些语言提供了模式匹配结构,允许您匹配(除其他外)平衡文本。

例如,Perl:

/function\s*\(\)\s*(\{([^{}]++|(?1))*\}/

这是否是工作的正确工具(提示:可能不是)完全是另一个问题。