Подтвердить что ты не робот

Emacs query-replace-regexp многострочный

Как вы выполняете запрос-replace-regexp в Emacs, который будет соответствовать нескольким строкам?

как тривиальный пример, я бы хотел, чтобы <p>\(.*?\)</p> соответствовал

<p>foo
bar
</p>
4b9b3361

Ответ 1

Попробуйте использовать классы символов. Пока вы используете только набор символов ASCII, вы можете использовать [[:ascii:]] вместо точки. Использование более длинного [[:ascii:][:nonascii:]] должно работать для всего.

Ответ 2

M-x re-builder

- твой друг. И это привело меня к этому регулярному выражению:

"<p>\\(.\\|\n\\)*</p>"

который является строковой версией

<p>\(.\|^J\)*</p>         ;# where you enter ^J by C-q C-j

И это работает для меня, когда я выполняю повторный поиск вперед, но не тогда, когда я делаю 'query-replace-regexp. Неужели почему...

Теперь, когда вы делаете 're-search-forward (aka C-u C-s), вы можете ввести M-%, который предложит вам заменить (как на Emacs 22). Таким образом, вы можете использовать это для поиска и замены с помощью указанного выше регулярного выражения.

Обратите внимание, что указанное выше regexp будет соответствовать до тех пор, пока в буфере не будет найден последний </p>, который, вероятно, не тот, который вы хотите, поэтому используйте re-builder для создания регулярного выражения, которое приближается к тому, что вы хотите. Очевидно, что регулярные выражения не могут подсчитывать круглые скобки, поэтому вы сами по себе - зависит от того, насколько надежным будет ваше решение.