Emacs查询替换正则表达式多行

29

如何在Emacs中进行跨多行匹配的query-replace-regexp操作?

举个简单的例子,我想要<p>\(.*?\)</p>进行匹配。

<p>foo
bar
</p>

1
我想你看过emacswiki: http://www.emacswiki.org/emacs/MultilineRegexp - seth
1
是的,我看到了,但是无法使用query-replace-regexp使其工作。仍在尝试中,现在使用re-builder进行测试...希望我能很快弄清楚。 - Neil Sarkar
1
这个例子很糟糕,因为使用正则表达式解析 HTML 通常不是一个好主意。 - Svante
4
很明显,在尝试使用正则表达式解析(例如反序列化或抓取HTML)和在编辑时使用它来节省时间和打字之间是有区别的。 - derekv
2个回答

25
M-x re-builder

正则表达式是你的好朋友。这导致我发现了这个正则表达式:

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

这是字符串版本的

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

当我使用're-search-forward时,这对我起作用,但是当我使用'query-replace-regexp时就不行了。不确定为什么...

现在,在执行're-search-forward(又称C-u C-s)时,你可以键入M-%,它会提示你进行替换(自Emacs 22以来)。因此,你可以使用它来执行上述正则表达式的搜索和替换。

请注意,上述正则表达式将匹配直到缓冲区中找到的最后一个</p>,这可能不是你想要的,因此使用re-builder构建更接近你想要的正则表达式。显然,正则表达式不能计数括号,所以这取决于你需要多健壮的解决方案。


re-builder 有信息文件吗?我想知道如何使用它。 - seth
1
我找不到相关信息。Emacs Wiki 上也没有太多相关内容。但这很容易理解(难道 Emacs 不都是这样的吗 :)。在输入 re-builder 后,按下 C-c C-h,你会得到一个绑定列表,其中包括适用于 re-builder 的所有以 C-c 开头的绑定。 - Trey Jackson
是的,我已经做到了那一步。只是在寻找更深入的东西。谢谢! - seth
搜索失败,状态码为0:grep: 未匹配 ( 或 \(。 - Marvin

23

尝试使用字符类。 只要您只使用ASCII字符集,就可以使用[[:ascii:]]代替点号。 使用较长的[[:ascii:][:nonascii:]]应该适用于所有内容。


1
如果你不只使用ASCII呢? - Jackson
[[:ascii:][:nonascii:]]* 给我造成了堆栈溢出。 - helcim
1
@ helcim,您应该在末尾添加“?”以使其变得非贪婪。 - justin
搜索失败,状态码为0:grep:无效的字符类名。 - Marvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接