Regex захватывают группы, разделенные на число между - PullRequest
1 голос
/ 27 марта 2020

Мне нужно захватить 3 группы из строки. Строка имеет следующий вид:

{phrase 1} {optional number} {optional phrase 2}

Вот несколько примеров:

Battery Bank 1
Battery Bank 1 Segments
Battery Bank 1 Warranty Logger
Battery Bank 10
Battery Bank 10 Segments
Battery Bank 10 Warranty Logger
BSU
BSU 1
PCS 3
PCS 1
System
System Meter

Как видите, единственная обязательная группа первый, состоящий из букв и пробелов в словах, пока не появится число, равное по крайней мере 1 ди git. Затем, опционально, еще одна группа символов слов и пробелов.

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

([a-zA-Z\s]+)(\d+)?(\w)?

Вот ссылка на regex101, с которой можно играть: https://regex101.com/r/tSGIEm/2

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Вы можете использовать это регулярное выражение с необязательными группами:

([a-zA-Z]+(?:[ \t]+[a-zA-Z]+)*)(?:[ \t]+(\d+)(?:[  \t]+(.+))?)?

Обновленная демоверсия RegEx

Подробности RegEx:

  • (: начать группу захвата # 1
    • [a-zA-Z]+: сопоставить слово из 1+ букв
    • (?:[ \t]+[a-zA-Z]+)*: сопоставить 0 или более слов, разделенных 1+ пробелами / tabs
  • ): конец группы захвата # 1
  • (?:: запуск группы без захвата # 1
    • [ \t]+: Соответствие 1+ пробелам или символам табуляции
    • (\d+): совпадение цифр 1+ и захват в группе # 2
    • (?:: начало группы без захвата # 2
      • [ \t]+: совпадение с 1+ пробелами или табуляциями
      • (.+): сопоставление 1+ любых символов и захват в группе # 3
    • )?: окончание необязательно группа без захвата # 2
  • )?: конец необязательно группа без захвата # 1
1 голос
/ 27 марта 2020

Вы можете использовать

^(.*?)(?: +(\d+) *(.*))?$

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • (.*?) - Группа 1: любой ноль или более символов, кроме символов разрыва строки, как можно меньше
  • (?: +(\d+) *(.*))? - необязательная группа, соответствующая 1 или 0 вхождения:
    • + - 1+ пробелов
    • (\d+) - Группа 2: одна или несколько цифр
    • * - 0+ пробелов
    • (.*) - Группа 3: любой ноль или более символов, кроме символов разрыва строки, максимально возможное количество
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...