Emacs query-replace-regexp multiline

时间:2009-08-20 21:52:00

标签: regex emacs

如何在Emacs中执行query-replace-regexp,以匹配多行?

作为一个简单的例子,我希望<p>\(.*?\)</p>匹配

<p>foo
bar
</p>

2 个答案:

答案 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:]]应该适用于所有事情。