#regex #duplicates #notepad
#регулярное выражение #дубликаты #notepad
Вопрос:
У меня есть файл с файловой иерархией и соответствующим ему кодом CRC32:
Folder AFolder CFile three.txt 56efd95f
Folder AFile one.txt b8e1b873
Folder AFolder BFolder DFile four.txt 56efd95f
Folder AFolder BFile two.txt 21e8e9c9
Я использую notepad , и мне нужно знать регулярное выражение, способное находить строки с тем же CRC32.
В этом примере я ожидаю найти строку 1 и строку 3.
Я знаю, s[a-zA-Z0-9]{8,8}$
что могу сопоставить CRC32, но как я могу проверить, повторяются ли эти совпадения?
Более того, если бы я хотел удалить все, кроме CRC32, почему не работает выражение .*(?!s[a-zA-Z0-9]{8,8}$)
для замены совпадений пустой строкой и получения чистого списка CRC32?
Комментарии:
1. В качестве альтернативы вы можете импортировать файл в Excel / LibreOffice Calc и отсортировать по столбцу CRC. Затем прокрутите дубликаты файлов и идентификаторов.
2. @Robert Регулярное выражение веселее
3. Смотрите мой ответ ниже для поиска дублированных CRC-кодов. Если вы все еще заинтересованы в удалении всего, кроме кодов CRC, попробуйте
.*s(?=[a-zA-Z0-9]{8,8}$)
отключить эту. matches newline
опцию
Ответ №1:
Вы можете использовать что-то вроде:
/([da-f]{8}$)(?=.*1)/gms
([da-f]{8}$)
— найти CRC-код(?=.*1)
— убедитесь, что код CRC появляется снова
https://regex101.com/r/fpIOCN/1
В Notepad просто убедитесь, что включен параметр «. соответствует новой строке»
Комментарии:
1. @Thefourthbird Notepad — это не то же самое, что использовать regex101. Если я нажму «Найти далее», он выделит следующий. Fwiw, Notepad — действительно отличный инструмент для всех, кто начинает программировать!
2. @Thefourthbird Я не уверен, что происходит с вашим Notepad , но мой перебирает каждое совпадение по одному и выделяет его. Мой Notepad также настроен на подсвечивание всего, что я выделил. Обратите внимание, что на моем скриншоте первый
56efd95f
более темный зеленый, чем второй. Первое — это то, что выделено курсором, второе — это то, что Notepad является братом и показывает мне дополнительные совпадения.3. @Thefourthbird Настройки -> Настройки -> Выделение -> Включить «Интеллектуальное выделение»
4. @Thefourthbird Если вас смущает утверждение lookahead, попробуйте
([da-f]{8}$).*1
5. @Thefourthbird Я не возражаю против комментариев. Если OP так же запутан, то, надеюсь, они читают комментарии 🙂
Ответ №2:
Чтобы найти дублированные повторы:
(?s)h([a-zA-Z0-9]{8})$(?=.*h1$)
Смотрите доказательство.
Чтобы удалить все, кроме кодов CRC32:
.*h([a-zA-Z0-9]{8})$
Заменить на $1
. Смотрите другое доказательство. Затем отредактируйте -> Операции со строками -> Отсортируйте строки лексикографически по возрастанию и после этого удалите последовательные повторяющиеся строки.
Объяснение
--------------------------------------------------------------------------------
h horizontal whitespace
--------------------------------------------------------------------------------
( group and capture to 1:
--------------------------------------------------------------------------------
[a-zA-Z0-9]{8} any character of: 'a' to 'z', 'A' to
'Z', '0' to '9' (8 times)
--------------------------------------------------------------------------------
) end of 1
--------------------------------------------------------------------------------
$ end of a line
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
.* any character except n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
h horizontal whitespace
--------------------------------------------------------------------------------
1 what was matched by capture 1
--------------------------------------------------------------------------------
$ end of a line
--------------------------------------------------------------------------------
) end of look-ahead
Комментарии:
1. Большое вам спасибо! Решение работает и очень четкое объяснение, как жаль, что может быть только один принятый ответ
2. @Carlos Добро пожаловать. Вы можете проголосовать, щелкнув стрелку ВВЕРХ, чтобы уведомить всех, что ответ полезен.
3. Я проголосовал за ваш ответ, когда впервые прочитал его, но было показано сообщение о том, что из-за моей низкой репутации система не будет отображать его, но учтет. Теперь люди проголосовали за мой вопрос, у меня есть несколько баллов, и система отображает мой голос 😉