Необязательная группа RegEx с необязательной подгруппой - PullRequest
0 голосов
/ 14 февраля 2020

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

Вот выдержка:

test test 1970-2020 w15.txt
test 1970-2020 w15.csv
test  1990-99 q1 .txt
test 1981 w15 .csv
test test  w15.csv

Я пытаюсь извлечь информация по группам (имя-теста, (год) ?, суффикс, тип) с использованием следующего RegEx:

(.*)\s+([0-9]+(\-[0-9]+)?\s+)?((w|q)[0-9]+(\s+)?)(\..*)$

Работает за исключением дополнительной группы, совпадающей с годами (интервал года, один год или нет). год вообще). Чего мне не хватает, чтобы заставить шаблон работать?

Вот также ссылка на RegEx101 для тестирования:

https://regex101.com/r/wG3aM3/817

1 Ответ

3 голосов
/ 14 февраля 2020

Вы можете сделать шаблон немного более конкретным c и сделать необязательным содержание года

^(.*?)\s+((?:\d{4}(?:-(?:\d{4}|\d{2}))?)?)\s+([wq][0-9]+)\s*(\.\w+)$

Пояснение

  • ^ Начало строки
  • (.*?) Захват группа 1 Совпадение 0+ раз с любым символом, кроме новой строки без жадности
  • \s+ Совпадение с 1+ пробелами
  • ( Захват группа 2
    • (?: Группа без захвата
      • \d{4}(?:-(?:\d{4}|\d{2}))? Совпадение 4 цифр и, необязательно, - и 2 или 4 цифр
    • )? Закрыть группу без захвата и указать необязательный год
  • ) Закрыть группу 2
  • \s+ Совпадение с 1 + пробелами
  • ([wq][0-9]+) Захват группа 3 Совпадение либо w или q и 1+ цифр 0-9
  • \s* Совпадение 0 + пробельные символы
  • (\.\w+) Захват группа 4 , совпадение с точкой и 1+ символами слова
  • $ Конец строки

Regex demo

Обратите внимание, что \s также может соответствовать новой строке.

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