Regex для удаления всех функций из файла js [предпочтение Textmate] - PullRequest
0 голосов
/ 28 июня 2010

Я работаю над большим и чрезвычайно грязным файлом 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;

Я не совсем уверен, с чего начать. В идеале я хотел бы сделать это с RegEx Textmate, но я легко.

Ответы [ 5 ]

3 голосов
/ 28 июня 2010

Я не думаю, что это можно сделать только с помощью регулярных выражений, поскольку невозможно сопоставить начальные и конечные скобки (блоки кода), которые могут быть произвольно глубоко вложенными.

Чтобы сделать это надежно, вам потребуется рекурсивно просмотреть все блоки внутреннего кода, чтобы найти конец функции. Или что-то в этом роде (посчитайте количество фигурных скобок, ...).

1 голос
/ 28 июня 2010

Вы не можете.При этом вы можете использовать что-то вроде этого

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

, но произойдет сбой, если в функции есть { или } и вы ничего не можете с этим поделать

0 голосов
/ 28 июня 2010

Вы не можете сделать это с помощью «регулярного» выражения, но некоторые языки предоставляют конструкции сопоставления с образцом, которые позволяют вам сопоставлять (среди прочего) сбалансированный текст.

Например, Perl:

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

Является ли это правильным инструментом для работы (подсказка: вероятно, это не так) - это совсем другой вопрос.

0 голосов
/ 28 июня 2010

На мой взгляд, 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. Быстрый поиск в Google нашел это:

http://www.antlr.org/

0 голосов
/ 28 июня 2010

- Удалено - Карко прав, регулярное выражение будет очень наивным подходом к проблеме.
Для этого вам нужно PEG .

...