Regex возвращают только непустые после замены - PullRequest
1 голос
/ 12 апреля 2020

Учитывая эту текстовую строку из ; столбцов с разделителями:

a;; z
z;d;hh 
d;23
;;io;
b;b;12

a;b;bb;;;34

Это регулярное выражение

^(?:(a|b|z)(?:;|$)([^;\r\n]*)(?:;|$)([^;\r\n]*)(?:;.*)?|.*)$

с этой заменой $3 вернет 3-й столбец, если он существует, из строк, первый столбец которых a, b или z, как показано в этом demo

Мой вопрос заключается в том, как вернуть только непустые строки, как в:

    z
hh 
12
bb

Спасибо за любую помощь

1 Ответ

1 голос
/ 12 апреля 2020

Вы все еще можете сделать это с простым регулярным выражением: вам просто нужно переставить две альтернативы в шаблоне регулярного выражения и добавить дополнительный шаблон разрыва строки в конце.

Ваш шаблон имеет ^((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? - дополнительная последовательность разрыва строки
  • ) - конец группы.
...