Соответствуйте количественному символу слова столько раз в группе - PullRequest
0 голосов
/ 26 сентября 2018

Это сводит меня с ума.Строка выглядит следующим образом:

actionname {componentOne, componentTwo, componentThree}

в этом примере я должен был соответствовать в группах actionname, componentOne, componentTwo и componentThree.Конечно, точное число"компонентов" в скобках Я не буду знать , это хотя бы один, но может быть несколько.

Я пытался:

\w+

начальный уровень, соответствует всем, включая actionname.Это может соответствовать цели, но есть лучшие решения,

^actionname\s*{\s*(\w+)+\s*.*}

кровавый ад, соответствует только одному, в данном случае componentOne, даже я использовал квантификатор для сопоставления группы (\w+)+,

^actionname\s*{\s*(\w+)(:?\s*\,\s*(\w+)|\s*})

провал в этом суть.Я могу расширить совпадение до второго компонента, , но только декларативно , т.е. я не могу расширить группу до такого количества слов (разделенных , необязательными пробелами), как это может быть.Все представленные регулярные выражения с модификаторами гм .

Как получить правильный результат?

Отдельное спасибо хотя бы базовым объяснениям, а не только рабочему решению.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Мне не удалось заставить повторяющиеся группы захвата произвольной / неизвестной длины работать в JavaScript.Одним из обходных путей может быть то, что ожидаемая входная строка - это слово, за которым следует строка CSV в скобках.Мы можем использовать регулярное выражение, чтобы изолировать ведущее слово и строку CSV, а затем разделить содержимое CSV или произвольную длину на один массив.

var input = "actionname {componentOne, componentTwo, componentThree}";
var re = /^(\S+)\s+\{([^}]+)\}$/g;
var m;

m = re.exec(input);
results = [];
if (m) {
    results.push(m[1]);
    results.push(m[2].split(/, /));
    console.log(results.toString());
}
0 голосов
/ 26 сентября 2018

У вас есть два варианта, так как у PCER есть все, что нам нужно здесь.Сначала используйте положительный прогноз:

\w+(?=[^{}]*})

См. живую демонстрацию здесь

Это удобный обходной путь.Однако все зависит от вашей входной строки.Он говорит, что совпадают символы слова, за которыми следует (не обязательно сразу) закрывающая фигурная скобка } без совпадения с фигурной скобкой [{}] при ее достижении.

Другой вариант - \G.\G метасимвол существует для тех видов совпадений, которые должны начинаться с определенной точки.\G означает возобновление совпадения с того места, где заканчивается предыдущее совпадение, или с начала строки (как \A):

(?:actionname {|\G(?!\A))(\w+)[, ]*

Эта начальная точка регулярного выражения находится там, где он видит actionname.Он не выбирает другую сторону чередования, так как мы отключили \G от сопоставления начала строки, используя отрицательный прогноз (?!\A).После сопоставления actionname он пытается захватить символы слова и сопоставляет необязательные запятые и пробелы после него.Если g включено, оно возобновляет матч с того места, где заканчивается предыдущий матч.Таким образом, он фиксирует все эти слова.

Смотрите живую демонстрацию здесь

...