Необязательная группа захвата - PullRequest
1 голос
/ 29 мая 2020

Я хочу захватить значения некоторых ключей, которые могут быть необязательными, в частности, рассмотреть строку ниже

@Foo1:dog|a=5|b=6|c=10|d=12|e=2
@Foo2:cat|a=12|c=10|d=11|e=123
@Foo1:bat|a=213123|b=10
@Foo3:pet|c=346

Теперь я хочу захватить строки между @ и:,: и |, и значение ключей b, d, которые могут быть необязательными. Я должен записать следующее

Foo1, dog, 6, 12
Foo2, cat, 11
Foo1, bat, 10
Foo3, pet

Я использую это регулярное выражение ^@(\w+):(\w+).*(?:b=(\d+)).*(?:d=(\d+)), но оно работает только тогда, когда присутствуют оба b и d.

1 Ответ

1 голос
/ 29 мая 2020

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

^@(\w+):(\w+)(?:.*?\|b=(\d+))?(?:.*?\|d=(\d+))?

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки
  • @ - a @ char
  • (\w+) - Группа 1: один или несколько символов слова
  • : - двоеточие
  • (\w+) - Группа 2: один или несколько символов слова
  • (?:.*?\|b=(\d+))? - необязательная группа без захвата, соответствующая любым символам 0+, кроме символов разрыва строки, как можно меньше, затем |b=, а затем захват 1+ цифр в Группу 3
  • (?:.*?\|d=(\d+))? - необязательная группа без захвата, соответствующая любым символам 0+, кроме символов разрыва строки, как можно меньше, затем |d= и затем захват 1+ цифр в группу 4
...