Emacs query-replace-regexp multiline - PullRequest
       6

Emacs query-replace-regexp multiline

26 голосов
/ 21 августа 2009

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

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

<p>foo
bar
</p>

Ответы [ 2 ]

23 голосов
/ 21 августа 2009
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 (он же C-u C-s), вы можете набрать M-%, который предложит вам заменить (начиная с Emacs 22). Таким образом, вы можете использовать это для поиска и замены на приведенное выше регулярное выражение.

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

21 голосов
/ 21 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...