Regex, чтобы удалить строки, которые соответствуют второй строке? - PullRequest
3 голосов
/ 16 января 2020

У меня длинный список строк с множеством подобных ситуаций, строки с одинаковым вторым словом (вторая строка после пробела), но остальное отличается. Мне нужно сохранить только одну строку с уникальной второй строкой. Должно работать только для строк с одним и тем же вторым словом, которые всегда являются последовательными. Например, у меня есть строки:

lineA 12345<br/>lineB 12345<br/>lineC 12345<br/>lineD 788878<br/>lineE 110881<br/>lineF 110881<br/>lineG 110881<br/>lineH 287778<br/>lineJ 251287<br/>lineK 242424<br/>lineL 242424<br/>lineM 242424

для этого результата

lineA 12345
lineD 788878
lineE 110881
lineH 287778
lineJ 251287
lineK 242424

Итак, если второе слово в строке соответствует, удалите все строки, кроме одной. Я пытался создать регулярное выражение, но оно удаляется только в случае совпадения первого слова. Я не могу понять, как сделать это для второго слова после пробела, как в примере.

^(\S++).*\K(?:\R\1(?:\h.*|$))+

Ответы [ 3 ]

2 голосов
/ 16 января 2020

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

^\S+\K( \S++)([^ ]+\1)+

и заменит все совпадения на $1

См. живую демонстрацию здесь

2 голосов
/ 16 января 2020

Это можно сделать, захватив 2 группы, первая из которых является исходной строкой, которую вы хотите сохранить (\S+ (\d+)), а вторая - вложенная группа с повторяющимися цифрами (в вашем случае (\d+)).

Затем мы находим все последующие строки (жадные), которые соответствуют шаблону, когда цифры повторяются \2 в пределах (?:\R\S+ \2)+, и заменяем все из них на первую строку $1.

Найти регулярное выражение без перевода строки: (\S+ (\d+))(?:\R\S+ \2)+
Заменить все на: $1

Редактировать: Спасибо Аарону за трюк с переводом строки! Узнай что-то новое после 16 лет в npp!

1 голос
/ 16 января 2020
  • Ctrl + H
  • Найти что: ^\S+\h+(\S+)\R\K(?:\S+\h+\1(?:\R|\Z))+
  • Заменить на: LEAVE EMPTY
  • CHECK Обтекание
  • CHECK Регулярное выражение
  • Заменить все

Демонстрация и объяснение

Снимок экрана (до):

enter image description here

Снимок экрана (после):

enter image description here

...