Ошибка обратной ссылки в Блокноте ++ Непрерывный Искатель Дублирования Линии Regex - PullRequest
0 голосов
/ 12 февраля 2020

Кажется, что есть ошибка в поведении поиска / замены 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 регулярное выражение должно потреблять каждый символ только один раз.
  • Я думал, что может быть ограничение на количество символов в файле, но я опроверг эту гипотезу играя с файлом, добавляя символы здесь и там. Два файла с одинаковым количеством строк и одинаковым количеством символов могут вести себя по-разному: один с ошибочным поведением, другой без.

Снимки экрана

До

Before Replace All

После без совпадений Newline (предполагаемая конфигурация)

After Replace All

После с совпадениями Newline (для Эксперименты)

After With Matches Newline

1 Ответ

0 голосов
/ 12 февраля 2020

(?:\s|.) следует избегать, так как это вызывает неожиданное поведение, я предлагаю использовать [\s\S] вместо:

  • Найти что: ^(.+)$[\s\S]+?^(\1)$
  • Заменить на: $1$2
...