2012-04-19 3 views
1

У меня есть что-то вроде этогоMatching повторен группы

{{ a_name a_description:"a value" another_description: "another_value" }} 

Я хочу, чтобы соответствовать a_name и все описания и ценности.

regex I'm using right теперь

{{\s*(?<function>\w+)\s+((?<attr>\w+)\s*\:\s*\"(?<val>\w+?)\"\s*)+}} 

Но что соответствует только последней группе, как я могу соответствовать всем группам? Я использую JavaScript, если это актуально.

ответ

0

В JavaScript:

var re = /{{ (\w+) (\w+):\"([a-zA-Z_ ]+)\" (\w+): \"([a-zA-Z_ ]+)\" }}/ 
var out = re.exec('{{ a_name a_description:"a value" another_description: "another_value" }}') 

out будет массив с матчами вам нужно.

Если вам нужно захватить родовое количество key: "value" пар, это поможет:

var str = '{{ a_name a_description: "a value" another_description: "another_value" }}' 
var pat = /[a-zA-Z_]+: "[a-zA-Z_ ]*"/gi 
str.match(pat) 
+0

Ummm но что, если у меня есть более двух групп параметров, в виде desc: "val", что делать, если у меня есть 20 – gosukiwi

+0

Я отредактировал ответ соответственно. –

0

Вы должны будете сделать это в 2-х частей, сначала нужно получить имя, а затем пары описание/значение.

str = '{{ a_name a_description:"a value" another_description: "another_value" }}'; 
name = /\w+/.exec(str); 

// notice the '?' at the end to make it non-greedy. 
re = /(?:(\w+):\s*"([^"]+)"\s*)+?/g; 
var res; 
while ((res = re.exec(str)) !=null) { 
    // For each iteration, description = res[1]; value = res[2]; 
} 

ETA: Вы можете сделать это с одним регулярным выражением, но это не усложнять:

re = /(?:{{\s*([^ ]+))|(?:(\w+):\s*"([^"]+)"\s*)+?/g; 
while ((res = re.exec(str)) !=null) { 
    if (!name) { 
     name = res[1]; 
    } 
    else { 
     description = res[2]; 
     value = res[3]; 
    } 
} 
0

Я действительно думаю, что правильный путь с этим случаем является водопад подход: сначала извлечь имя функции, затем проанализировать параметры только с помощью split.

var testString = '{{ a_name a_description:"a value" another_description: "another_value" }}'; 
var parser = /(\w+)\s*([^}]+)/; 
var parts = parser.exec(testString); 

console.log('Function name: %s', parts[1]); 
var rawParams = parts[2].split(/\s(?=\w+:)/); 
var params = {}; 
for (var i = 0, l = rawParams.length; i < l; ++i) { 
    var t = rawParams[i].split(/:/); 
    t[1] = t[1].replace(/^\s+|"|\s+$/g, ''); // trimming 
    params[t[0]] = t[1]; 
} 
console.log(params); 

Но, возможно, я ошибаюсь.)

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