Вы все еще можете сделать это с простым регулярным выражением: вам просто нужно переставить две альтернативы в шаблоне регулярного выражения и добавить дополнительный шаблон разрыва строки в конце.
Ваш шаблон имеет ^((O)(N)(E)|.*)$
структура, поэтому вторая альтернатива соответствует всей строке, если первая не совпадает, но обе альтернативы будут останавливаться в конце строки (вы используете многострочный флаг, поэтому $
соответствует всем позициям до конца или конца строки строки). Итак, вам нужно преобразовать его в ^(?:(O)(N)(E)$|.*$\R?)
:
^(?:(a|b|z)(?:;|$)([^;\r\n]*)(?:;|$)([^;\r\n]*)(?:;.*)?$|.*$\R?)
^^^^^^^^^
См. Демонстрационную версию regex , в тестере regex101, обратите внимание на использование модификаторов g
и m
.
Итак, в общем случае шаблон
^
- начало строки (?:
- начало группы без захвата (так что ^
может применяться к обеим альтернативам): (a|b|z)(?:;|$)([^;\r\n]*)(?:;|$)([^;\r\n]*)(?:;.*)?$
- ваш указанный c шаблон захватывает необходимые подстроки, вплоть до конца строки / строки |
- или .*$
- любые 0+ символов, кроме символов разрыва строки, как можно больше, вплоть до конца строки / строки ($
), а затем \R?
- дополнительная последовательность разрыва строки
)
- конец группы.