Конгломерат групп JavaScript RegEx

Я пытаюсь проанализировать следующий формат строки:

<id>:<name>[,<name>]*

В качестве примера рассмотрим 123:test,south-west,best,rest_well.

Я написал следующее регулярное выражение:

/(\d+):([a-zA-Z0-9_\-]+)(?:,([a-zA-Z0-9_\-]+))*/

Я предполагал, что (?:,([a-zA-Z0-9_\-]+)) захватит необязательные дополнительные имена (south-west, best и rest_well). Однако он фиксирует только фамилию «rest_well».

Распечатанное совпадение:

'123:test,south-west,best,rest_well'.match(/(\d+):([a-zA-Z0-9_\-]+)(?:,([a-zA-Z0-9_\-]+))*/);
> ["123:test,south-west,best,rest_well", "123", "test", "rest_well"]

Что я ожидал:

> ["123:test,south-west,best,rest_well", "123", "test", "south-west", "best", "rest_well"]

Я полагаю, что другие языки на самом деле будут накапливать совпадающие группы, но почему-то это не удается. Возможно, я упускаю какую-то маленькую деталь. Любая помощь приветствуется!


person Vadym    schedule 20.06.2014    source источник
comment
Да, похоже, это так. Очень жаль, но я могу написать это по-другому. Просто надеялся на красивое решение ;)   -  person Vadym    schedule 20.06.2014
comment
Простым решением было бы разделить на разделитель. См. ответ Яте.   -  person Amal Murali    schedule 20.06.2014


Ответы (1)


Похоже, вы просто хотите разделить строку на : или ,. Будет ли это работать?

var str = "123:test,south-west,best,rest_well";
var res = str.split(/:|,/);

Вывод

["123", "test", "south-west", "best", "rest_well"]
person yate    schedule 20.06.2014
comment
Эй, это довольно милое решение! Я бы просто добавил следующий тест для проверки формата: var re = new RegExp(/^\d+:[a-zA-Z0-9_\-]+(?:,[a-zA-Z0-9_\-] +)*$/), str = '123:тест,юго-запад,лучший,остальное_колодец', res = null; if (re.test(str)) { res = str.split(/:|,/) } else { res = []; } - person Vadym; 20.06.2014