#regex #notepad
Вопрос:
У меня есть тысячи файлов, в каждом из которых есть один фрагмент строк, которые начинаются с #WAV
. Этот фрагмент может находиться в любом месте файла, но всегда является «фрагментом»
#WAV 001.wav
#WAV "something"
#WAV 21021029910291029.ogg
Эти фрагменты могут быть длиной 1000 строк или всего 3, как в приведенном выше примере
Мне нужно заменить весь кусок (все строки, которые начинаются с #WAV) одной строкой.
Так что вышесказанное просто стало бы
EXAMPLE REPLACEMENT
Обратите внимание, что это должно работать для любого куска размера, и то, что может произойти после #WAV
, непредсказуемо.
использование #WAV.*
в качестве регулярного выражения не сработает, потому что оно заменит все вхождения этой строки, а не весь фрагмент.
использование #WAV(.*)#WAV
и попытка заменить группу захвата не сработают, потому что я не могу быть уверен в «конце» группы захвата.
Комментарии:
1. Почему бы вам не использовать для этого простой скрипт на Python? Я верю, что ваша проблема может быть решена довольно быстро
Ответ №1:
Воспользуйся
^#WAVb.*(?:R#WAVb.*)*
См.Доказательство регулярного выражения.
объяснение
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
#WAV '#WAV'
--------------------------------------------------------------------------------
b the boundary between a word char (w) and
something that is not a word char
--------------------------------------------------------------------------------
.* any character except n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
(?: group, but do not capture (0 or more times
(matching the most amount possible)):
--------------------------------------------------------------------------------
R line ending
--------------------------------------------------------------------------------
#WAV '#WAV'
--------------------------------------------------------------------------------
b the boundary between a word char (w)
and something that is not a word char
--------------------------------------------------------------------------------
.* any character except n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
)* end of grouping
Комментарии:
1. Просто всегда лучше, но этот ответ тоже очень хорош
2. @RafaeldeBem Это удаляет
#WAV
s даже в последней строке. Он тоже проверяет , так ли это#WAVE...
.3. Разве
(^#WAV .*[rn] )
(с пробелом) это не сработало бы так же хорошо?4. Нет, нет, этого не будет
Ответ №2:
Вы можете использовать следующее регулярное выражение:
(^#WAV.*[rn] )
Это будет соответствовать всем строкам, начинающимся с #WAV, в одном выделении.