Соответствие регулярному выражению и группировка до последовательности символов - PullRequest
2 голосов
/ 22 июня 2019

У меня есть строка, содержащая несколько ключевых слов со значениями, разделенными двоеточием (и, возможно, пробелом). Пары ключевое слово и значение сами по себе разделяются только пробелом (или вообще ничего).

Вот некоторые примеры:

"TAG1: asd asd testTAG2:TEST"
"TAG1:asd asd test TAG2:TEST"
"TAG1: asd asd test TAG2:TEST TAG1:hello"

Затем я использую это регулярное выражение для сопоставления (TAG1|TAG2): ?(.+), которое работает только при наличии одной пары тегов. Поэтому я попытался использовать положительный прогноз ((TAG1|TAG2): ?(.+)(?=TAG1|TAG2)) для сопоставления до следующего вхождения, но это, очевидно, не работает, если у меня одна пара, и не работает, если у меня более двух пар.

Так что мне интересно, как вы можете разбить его на совпадения, которые затем имеют группу для имени тега и другую группу для значения:

"TAG1: asd asd testTAG2:TEST"
[["TAG1", "asd asd test"], ["TAG2", "TEST"]]

"TAG1:asd asd test TAG2:TEST"
[["TAG1", "asd asd test"], ["TAG2", "TEST"]]

"TAG1: asd asd test TAG2:TEST TAG1:hello"
[["TAG1", "asd asd test"], ["TAG2", "TEST"], ["TAG1", "hello"]]

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

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

Мы можем попытаться использовать регулярное выражение, разделенное дважды, один раз, чтобы получить массив всех тегов и их значений, и второй раз, чтобы заполнить двумерный массив.

var input = "TAG1: asd asd test TAG2:TEST TAG1:hello";
var tags = input.split(/\s*(?=TAG)/);
var output = [];
tags.forEach(function (item, index) {
    output.push(item.split(/:\s*/));
});
console.log(output);
1 голос
/ 22 июня 2019

Я бы использовал метод разделения:

var test = [
    "TAG1: asd asd testTAG2:TEST",
    "TAG1:asd asd test TAG2:TEST",
    "TAG1: asd asd test TAG2:TEST TAG1:hello"
];
console.log(test.map(function (a) {
  return a.split(/(TAG1|TAG2):/);
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...