Regex, как захватывать повторяющиеся значения без захвата пробелов вокруг текста - PullRequest
2 голосов
/ 12 июля 2019

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

prof:

    prof1

    prof2

    prof3

    ...

Я не знаю, сколько будет в списке, возможно также, что значений не будет, но я хочу захватить prof1, prof2, prof3 и т. д. без пробелов по обе стороны.У меня есть регулярное выражение для стартера:

prof:\s*([\w-]*)

Это фиксирует первое значение проф, но не другие.Если я добавлю * в конце группы захвата, ни один из них не будет захвачен.Если я добавлю [] по обе стороны от группы захвата, это приведет к ошибке, при которой он не сможет выяснить, для чего нужны закрывающие скобки.

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

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Другим вариантом может быть совпадение prof: и захват всех после в группе захвата и проверка, что между prof1, prof2 и т. Д. Есть 1+ пустых строк.

Затем разбейте эту группу на 1+ пробельные символы \s+

\bprof:[ \t]*((?:(?:\n[ \t]*$)+\n[ \t]+[\w-]+)*)

Пояснение

  • \bprof:[ \t]* Граница слова, соответствует проф: следуют 0+ табуляция / пробелы
  • ( Группа захвата 1
    • (?: Группа без захвата
      • (?:\n[ \t]*$)+ Совпадение 1+ раз новой строки, 0+ табуляции / пробелов и подтверждения конца строки
      • \n[ \t]+[\w-]+ Соответствие новой строки, 1+ табуляции / пробелов, 1+ словечек / дефисов
    • )* Закройте группу без захвата и повторите 0+ раз
  • ) Закрыть группу захвата 1

Regex demo

const regex = /\bprof:[ \t]*((?:(?:\n[ \t]*$)+\n[ \t]+[\w-]+)*)/m;
const str = `prof:

    prof1

    prof2

    prof3

    ...`;
let res = str.match(regex)[1].split(/\s+/).filter(Boolean);

console.log(res);
0 голосов
/ 12 июля 2019

Я предполагаю, что это выражение в режиме m может быть опцией, хотя и не уверен:

([\s\S]*?)(prof:)|([\w-]*)

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

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