Regex Удалить несоответствующую строку при замене - PullRequest
2 голосов
/ 11 апреля 2020

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

a;b;c
a;x;23
b;b;12

Я хочу получить столбец 3 каждой строки, которая имеет a в столбце 1 с ^(a);(.*?);(.*?)$, как показано здесь .

Однако, как вы можете видеть, полная не совпадающая строка также присутствует в результате после подстановки.

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

Спасибо

Ответы [ 2 ]

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

Вместо замены вы также можете получить совпадение, только начав совпадение с. Затем сопоставьте второй столбец и используйте \K, чтобы забыть, что соответствует.

Затем сопоставьте третий столбец. Тогда значения для столбца 2 и столбца 3 могут быть сопоставлены с использованием отрицательного класса символов .

^a;[^;\r\n]+;\K[^;\r\n]+$
  • ^ Начало строки
  • a; Совпадение буквально
  • [^;\r\n]+; Столбец 2, совпадение с любым символом, кроме ; или новой строки
  • \K Сброс буфера совпадений
  • [^;\r\n]+] Столбец 3, совпадение любой символ, кроме ; или новой строки
  • $ Конец строки

Regex demo

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

Вы можете добавить альтернативу .*, чтобы просто соответствовать строке, если первая альтернатива не совпадает:

^(?:(a);(.*?);(.*?)|.*)$
 ^^^               ^^^

См. Демонстрационную версию regex

ПРИМЕЧАНИЕ : Если требуется указать только две точки с запятой в строке, вам нужно использовать [^;]* вместо .*?:

^(?:(a);([^;]*);([^;]*)|.*)$

См. это демонстрационное выражение regex ( \n добавлен к отрицательному классу символов в демонстрационной версии, чтобы учесть тот факт, что тест регулярного выражения выполняется для одной многострочной строки, а не для набора отдельных строк).

...