Кажется, что есть ошибка в поведении поиска / замены Notepad ++ при использовании обратной ссылки для поиска дублирующих строк, которые не обязательно могут быть последовательными. Мне интересно, знает ли кто-нибудь, в чем может быть проблема с регулярным выражением, или если они знают, почему механизм регулярных выражений может работать с ошибками?
Подробности
Я хотел использовать регулярное выражение, чтобы найти дубликат строки в блокноте ++. Дубликаты не обязательно должны быть смежными, то есть на последовательных линиях между ними могут быть строки. Я начал с этого поста:
https://medium.com/@heitorhherzog / сравнение-сортировка-и-удаление-дубликаты-строки-в-блокноте-2d1938ed7009
Но понял, что регулярное выражение там упоминаются только проверки на смежные дубликаты. Поэтому я написал свое собственное регулярное выражение:
^(.+)$(?:(?:\s|.)+)^(\1)$
Вышеописанное в основном захватывает что-то в целую строку, затем сопоставляет загрузку промежуточного содержимого, а затем фиксирует то же самое в строке.
Что не так
Регулярное выражение работает, но только иногда. Я не могу понять шаблон. Я до сих пор сводил это к этому. Если я произнесу «Заменить все» на шаблоне замены \1\2
, тогда «Заменить все» оставит меня только в строке 3, которая называется «относительные обратные ссылки32». Это неправильно:
dasfdasfdsfasdfasdfadsfasdf
elative backreferenceswe
elative backreferences32
elative backreferencesd
elative backreferencdesdfdasdfsdafsd
asfasdfasdfasdfasdfasfdsaasdfas
asdfasdfafds asdfasfdsafasd asdfdasfsd
elative backreferencessfhdfg
x
y
x
Но если я удаляю любую строку из этого файла, то только последовательные строки x
, затем y
, а затем x
заменяются одним строка xx
, как я и ожидал.
Примечания
- Я бы хотел сосредоточить этот вопрос главным образом на том, почему регулярное выражение выдает ошибку. Предложения об альтернативных способах поиска повторяющихся строк, конечно, хороши, но главная причина, по которой я спрашиваю это, - выяснить, что происходит с regex и Notepad ++.
- Мне не нужна замена части это, просто находка, я просто использовал замену, чтобы попытаться выяснить, какие группы были захвачены при попытке отладки этого
- Поведение поиска также содержит ошибки. Я заметил это первым на самом деле. Сначала он находит совпадение, которое я на самом деле ищу, а затем, если я снова нажимаю «Найти далее», он выделяет весь текст.
Гипотезы
- Есть ошибка в Notepad ++ v7.8.4 64 бит. Я только что обновил сегодня, так что, может быть, они еще не поймали его.
- Имеет ли промежуточная часть совпадения,
(?:(?:\s|.)+)
, возможно, цикл вокруг конца символа файла и l oop назад к оригинальному совпадению? Если это так, я бы сказал, что это все еще ошибка, потому что AFAIK регулярное выражение должно потреблять каждый символ только один раз. - Я думал, что может быть ограничение на количество символов в файле, но я опроверг эту гипотезу играя с файлом, добавляя символы здесь и там. Два файла с одинаковым количеством строк и одинаковым количеством символов могут вести себя по-разному: один с ошибочным поведением, другой без.
Снимки экрана
До
После без совпадений Newline (предполагаемая конфигурация)
После с совпадениями Newline (для Эксперименты)