Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式从js文件中删除所有函数[Textmate首选]_Javascript_Regex_Textmate - Fatal编程技术网

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

Javascript 正则表达式从js文件中删除所有函数[Textmate首选],javascript,regex,textmate,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

我正在处理一个很大而且非常混乱的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的正则表达式来实现这一点,但我很简单。

我认为仅使用正则表达式是不可能的,因为不可能匹配可以任意深度嵌套的开始和结束大括号(代码块)

要可靠地执行此操作,您需要递归地查看所有内部代码块以定位函数的结尾。或者类似的东西(计算大括号的数量,…。

--Deleted-Carko是对的,regexp是解决这个问题的一种非常简单的方法。

你需要一个合适的答案。

你不能。也就是说你可以用这样的东西

function\s+\w+\s*\([^)]*\)\s*{[^}]*}

但是如果函数中有任何
{
}
,并且您对此无能为力,那么它将失败。在我看来,Regex不足以完成如此复杂的任务。我能用regex做的最好的事情是:

[\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解析器。谷歌快速搜索发现:

使用“正则”表达式无法实现这一点,但有些语言提供了模式匹配结构,允许您匹配(除其他外)平衡文本

例如,Perl:

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

它是否适合这项工作(提示:它可能不是)完全是另一个问题。

非常粗糙的尝试:
function\s*+\(.*\)\s*{.+}
,多行,红宝石风格,不区分大小写。虽然我不认为正则表达式适用于此(见下面的评论),但这是一个了解正则表达式的好网站:考虑:
var s=“function foo(){”var x=42;s=“}”
@Bart K.;-)但是,我要求您提供这样一个字符串的实际示例。如果您可以指导lynch mob,则会得到额外的好处。最简单的解决方案是只使用正则表达式,但检查它的每一次出现,而不是使用盲目的“全部替换”“。应该足够好,并且可以节省大量时间。您仍然需要担心字符串中的大括号。它也会在以下方面失败:
函数XYZ(parm1,(parm2*10)){…}