如何在Emacs中执行query-replace-regexp,以匹配多行?
作为一个简单的例子,我希望<p>\(.*?\)</p>
匹配
<p>foo
bar
</p>
答案 0 :(得分:23)
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来构建一个更接近的正则表达式到你想要的。显然正则表达式不能计算括号,所以你可以自己计算 - 取决于你想要的解决方案的强大程度。
答案 1 :(得分:21)
尝试角色课程。只要您只使用ASCII字符集,就可以使用[[:ascii:]]
而不是点。使用较长的[[:ascii:][:nonascii:]]
应该适用于所有事情。