Необязательная группа не была захвачена - PullRequest
1 голос
/ 20 сентября 2019

Я получил огромный список записей, которые мне нужно превратить в таблицу, например:

********************
alwaysThere1=09/2019
alwaysThere2=987456
bunch of stuff 
i dont need
optional=698,00
more stuff i dont need
********************
alwaysThere1=06/2019
alwaysThere2=123658
bunch of stuff 
more stuff 
********************
alwaysThere1=09/2019
alwaysThere2=987699
bunch of stuff
optional=9999,00
stuff more stuff

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

^[\*].+?alwaysThere1=(\d\d\/\d\d\d\d).+?alwaysThere2=(\d{6}).+?((:?optional=)[\d,]+)?[^\*]+

Я хочу получить что-то вроде этого:

09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00

Однако, используя шаблон замены \1;\2;\4\n в Notepad ++, я получаю толькоэто:

09/2019;987456;
06/2019;123658;
09/2019;987699;

Почему я не могу захватить дополнительную группу?Образец, кажется, соответствует всей записи, не переходя.

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете использовать 3 группы захвата и использовать их в замене.Чтобы предотвратить совпадение, вы можете использовать повторяющиеся группы и отрицательный прогноз, чтобы убедиться, что строка не начинается только с *.

Поскольку есть части, которые всегда есть, вы можете сначала сопоставить их спервые 2 строки.

^\*+\R.*=(\d+/\d{4})\R.*=(\d{6})(?:\R(?!(?:.*=\d+,\d+|\*+)$).*)*(?:\R.*=(\d+,\d+))?(?:\R(?!\*+$).*)*

По частям

  • ^ Начало строки
  • \*+ Совпадение 1+ раз *
  • \R.*= Последовательность новой строки Unicode, соответствует до последнего =
  • (\d{2}/\d{4}) Capture группа 1 соответствует 2 цифрам / 4 цифры
  • \R.*= Последовательность новой строки Unicode, соответствует до последнего =
  • (\d{6}) Захват группа 2 совпадение с 6 цифрами
  • (?: Группа без захвата
    • \R(?!(?:.*=\d+,\d+|\*+)$).* Строка соответствия, которая не содержит только * или шаблон =\d+,\d+
  • )* Закройте группу и повторите 0+ раз, чтобы сопоставить все эти строки
  • (?:\R.*=(\d+,\d+))? При желании сопоставить строку, которая содержит шаблон =\d+,\d+ и захватывать цифры запятыми в группе 3
  • (?: Группа без захвата
    • \R(?!\*+$).* Строка соответствия, которая не содержит * только
  • )* Закройте группу и повторите 0+ раз, чтобысоответствовать всем этим строкам

Regex demo

$1;$2;$3

Выход

09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00
...