2014-01-14 2 views
0

Я борюсь с созданием регулярного выражения для соответствия параметрам функции js. Я работаю над проектом, где мне нужно разобрать javascript, и мне нужно регулярное выражение, которое будет соответствовать всему, что находится между круглыми скобками для функций.Регулярное выражение для аргументов в функции Javascript между круглыми скобками

function foo (bar) {} // should match 'bar' 

Foo.bar = function (baz, obj) {} // should match only 'baz, obj' 

Он должен соответствовать только материал с после того, как «функции» или «функции Foo», в основном, так что не соответствует вещи между Paren внутри функциональных органов. Мне нужно это, чтобы исключить фактические символы ('и') '. Также я пробел между «функцией» или именем функции и открытием »(« может быть бесконечным ».

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

(?<=,|\()([#a-z0-9]+)(?=(,?[#a-z0-9]+)+\)|\)) 

Update:.! Это еще одно выражение я пытаюсь получить работу . Это ближе, чем выше, но позволяет только одно пространство между «функцией» и «(», а также не распространяется на корпус 1 выше.

\b(?<=(function.)\()([^),]+)[^)]*\b 
+3

Я думаю, что вам предстоит долгая ночь, если вы надеетесь использовать регулярное выражение для разбора javascript. Для этой задачи существуют синтаксические анализаторы языка. Вы также можете легко найти файл грамматики javascript, подходящий для ваших нужд. Если вы надеетесь пойти гораздо дальше, чем этот конкретный вопрос, вы должны рассмотреть другие методы. –

+0

Почему вы не начинаете регулярное выражение с 'function'? – elclanrs

+1

Что делать, если какой-либо синтаксис функции появляется в строковом литерале? Должно ли это соответствовать? Зачем вам это нужно в первую очередь? –

ответ

3

попробовать как:

var s = "Foo.bar = function (baz, obj) {}" 
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1]; 
console.log(s2); //would give baz and obj 


var s = "function foo (bar) {}"; 
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1]; 
console.log(s2); //returns bar 

обновление:

var pattern = /\(([^)]+)/; 
var s = "Foo.bar = function (baz, obj) {}" 
var s2 = s.match(pattern)[1]; 
console.log(s2); 
+1

Как насчет 'function foo (bar) {}'? – Sam

+1

В этом случае он возвращает бар, разве это не требуется. –

+0

Плохо, я неправильно читаю ваше регулярное выражение. – Sam

1

От Angular Sources

TL; DR: var FN_ARG = /^function\s*[^\(]*\(\s*([^\)]*)\)/m, затем str.match(FN_ARG)[1]

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

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; 
var FN_ARG_SPLIT = /,/; 
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; 
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; 
var $injectorMinErr = minErr('$injector'); 
function annotate(fn) { 
    var $inject, 
     fnText, 
     argDecl, 
     last; 

    if (typeof fn == 'function') { 
    if (!($inject = fn.$inject)) { 
     $inject = []; 
     if (fn.length) { 
     fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
     argDecl = fnText.match(FN_ARGS); 
     forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
      arg.replace(FN_ARG, function(all, underscore, name){ 
       $inject.push(name); 
       }); 
      }); 
     } 
     fn.$inject = $inject; 
    } 
    } else if (isArray(fn)) { 
    last = fn.length - 1; 
    assertArgFn(fn[last], 'fn'); 
    $inject = fn.slice(0, last); 
    } else { 
    assertArgFn(fn, 'fn', true); 
    } 
    return $inject; 
} 

Во-первых, угловые полосы от возможных мест и комментариев. Затем в FN_ARGS он сопоставляется с необязательным именем функции после ключевого слова function и извлекает список аргументов, объединенный с помощью comma.И наконец, он разбивает список аргументов запятыми.

Возможно, вы можете пропустить часть комментария, если вы знаете, что комментарий не появится. Если вы хотите принять во внимание комментарии, построенный REGEXP будет слишком длинным.

Наконец, не забудьте указать флаг m, чтобы регулярное выражение находилось в многострочном режиме, в котором каретка и доллар совпадают в начале и конце каждой строки в строке темы.

Смежные вопросы