Использование REGEX для удаления дубликатов, когда вся строка не является дубликатом - PullRequest
3 голосов
/ 04 ноября 2019
^(.*)(\r?\n\1)+$

заменить на \1

Выше приведен отличный способ удалить дубликаты строк с помощью REGEX, но требуется, чтобы вся строка была дубликатом

Однако - что бы яиспользуйте, если я хочу обнаружить и удалить дуплики - когда вся строка не целая, а всего лишь первые X символов

Пример: Исходный файл

12345 Dennis Yancey     University of Miami
12345 Dennis Yancey     University of Milan
12345 Dennis Yancey     University of Rome
12344 Ryan Gardner      University of Spain
12347 Smith John        University of Canada

Дуплики удалены

12345 Dennis Yancey     University of Miami
12344 Ryan Gardner      University of Spain
12347 Smith John        University of Canada

1 Ответ

4 голосов
/ 04 ноября 2019

Как насчет использования второй группы для проверки, например, первых 10 символов:

^((.{10}).*)(?:\r?\n\2.*)+

Где {n} указываетколичество символов из linestart, которые должны быть проверены на дублирование.

  • вся строка записана в $1, что также используется в качестве замены
  • , вторая группа используется для проверкиповторяющаяся строка начинается с

См. эту демонстрацию на regex101


Другая идея - использование lookahead и замените на пустую строку :

^(.{10}).*\r?\n(?=\1)

Эта строка просто отбросит текущую строку, если захваченный $1 будет впереди следующей строки.

Вот демоверсия в regex101


Для удаления также повторяющихся строк, содержащих до 10 символов, идея PCRE с использованием условий: ^(?:(.{10})|(.{0,9}$)).*+\r?\n(?(1)(?=\1)|(?=\2$)) и замените его на пустую строку.

Если ваш регулярный выражение поддерживает притяжательные квантификаторы , используйте .*+ улучшит производительность .

Имейте в виду, что все эти шаблоны (и ваше текущее регулярное выражение) просто нацелены на последовательных повторяющихся строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...