2013-05-15 2 views
4

Рассмотрим следующую строку method<arg1,arg2,arg3>Получение нескольких совпадений для группы в RegEx

Я хотел бы использовать регулярные выражения, чтобы получить части method, arg1, arg2, arg3 из этой строки.

Следующее регулярное выражение /([a-z0-9]+)<(?:([a-z0-9]+),?)*>/i соответствует строке в целом.

То есть,

var result = /([a-z0-9]+)<(?:([a-z0-9]+),?)*>/i.test('method<arg1,arg2,arg3>'); 
// result = true 

Но regEx.exec метод возвращает только method, arg3 части.

result = /([a-z0-9]+)<(?:([a-z0-9]+),?)*>/i.exec('method<arg1,arg2,arg3>'); 

// result is ["methodname<arg1,arg2,arg3>", "methodname", "arg3"] 

// as opposed to 
// ["methodname<arg1,arg2,arg3>", "methodname", "arg1", "arg2", "arg3"] 

Есть ли способ получить все матчи группы?

Примечание: Я прошу об этом с целью обучения, и я не хочу, чтобы работа JavaScript работала.

Редактировать: Число аргументов (arg1, arg2 и т. Д.) Является произвольным и может меняться в разных случаях.

+1

Это может помочь: HTTP: //www.regular-expressions .info/captureall.html – techfoobar

+0

Может 'метод ' появляться несколько раз в строке? –

+0

+1, хорошо, хорошо сформированный вопрос – Senjai

ответ

0

Ниже будет работать:

input = "method<arg1,arg2,arg3>"; 
action = input.match (/^(\w*)\s*<\s*(.*)?\s*>$/); 
action[2] = action[2].split (/\s*,\s*/); // array of args 

;; processing method action[1] and arguments action[2] (an array) 
+0

Это наиболее близко к ответу, который мне нужен. Комментарий @ techfoobar в вопросе объясняет, почему это невозможно сделать с помощью одного регулярного выражения. – ManojRK

1

Попробуйте это регулярное выражение

\b([^<]*)<([^,]*),([^,]*),([^>]*)>

enter image description here

Захваченные группы:

0: "method<arg1,arg2,arg3>" 
1: "method" 
2: "arg1" 
3: "arg2" 
4: "arg3" 

Любое количество аргументов

\b([^<]*)<([^>]*)> вытаскивает имя и все argumen ц.

enter image description here

Захваченные группы:

0: "method<arg1,arg2,arg3>" 
1: "method" 
2: "arg1,arg2,arg3" 

Тогда я просто разделить группы 2 на известном разделителем ,

+0

Хотя это правильно для 3 аргументов, оно не является динамическим и не будет работать, если количество аргументов неизвестно. – techfoobar

+0

Я хочу знать динамическое количество аргументов. – ManojRK

+0

OP не указал, что существует множество аргументов –

2

Вы должны разделить это на два выражения, один для внешняя строка и одна для внутренней; тем не менее, внутреннее выражение может быть упрощено до простого регулярного разделения строк.

var str = 'method<arg1,arg2,arg3>', 
outer_re = /(\w+)<([^>]*)>/g; 

while ((match = outer_re.exec(str)) !== null) { 
    var fn = match[1], 
    args = match[2].split(','); 

    console.log(fn, args); 
} 

Demo

Кстати, это может соответствовать несколько экземпляров методов, например,:

"method1<arg1> method2<arg1,arg2>" 

Если в этом нет необходимости вы можете прикрепить выражение:

/^([^<]+)<([^>]*)>$/;