Регулярное выражение для поиска всех методов в куске кода - PullRequest
1 голос
/ 19 марта 2009

Я пытаюсь написать регулярное выражение для соответствия всем определениям метода JavaScript в строке конструктора.

//These two should match
this.myMethod_1 = function(test){ return "foo" }; //Standard
this.myMethod_2 = function(test, test2){ return "foo" }; //Spaces before

//All of these should not
//this.myMethod_3 = function(test){ return "foo" }; //Comment shouldn't match
/**
 *this.myMethod_4 = function(test){ return "foo" }; //Block comment shouldn't match
 */

//       this.myMethod_5 = function(test){ return "foo" }; //Comment them spaces shouldn't match

/*
 *        this.myMethod_6 = function(test){ return "foo" }; //Block comment + spaces shouldn't match
 */

this.closure = (function(){ alert("test") })(); //closures shouldn't match

Регулярное выражение должно соответствовать ['myMethod_1', 'myMethod_2']. Регулярное выражение не должно совпадать ['myMethod_3', 'myMethod_5', 'myMethod_6', 'closure'].

Вот что у меня пока есть, но у меня проблемы с теми, которые появляются в комментариях:

/(?<=this\.)\w*(?=\s*=\s*function\()/g

Я использовал этот крутой сайт , чтобы проверить его.

Как мне решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 19 марта 2009

Звучит сложно сделать это правильно. Для этого вам нужно будет создать парсер, простое регулярное выражение, скорее всего, не сделает этого.

Очень хорошей отправной точкой является Нарцисс , который представляет собой синтаксический анализатор JavaScript, написанный на ... JavaScript.

Это всего лишь 1000 строк кода. Должна быть возможность извлечь только части, соответствующие методам.

0 голосов
/ 19 марта 2009

Одно регулярное выражение может быть сложно написать и отладить. Подумайте о написании нескольких регулярных выражений, по одному для каждой строки, которые должны либо соответствовать, либо подтверждать, либо отклонять фрагмент кода.

Например,

/(?<=this.)\w*(?=\s*=\s*function()/g  // Matches a simple constructor.
/^\/\// // If it matches then this line starts with a comment.

и т. Д.

0 голосов
/ 19 марта 2009

Добавление ^\s* к началу может помочь. Это не идеально, но это будет работать для ваших тестовых случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...