如何在Emacs中进行跨多行匹配的query-replace-regexp操作?
举个简单的例子,我想要<p>\(.*?\)</p>
进行匹配。
<p>foo
bar
</p>
如何在Emacs中进行跨多行匹配的query-replace-regexp操作?
举个简单的例子,我想要<p>\(.*?\)</p>
进行匹配。
<p>foo
bar
</p>
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
后,按下 C-c C-h
,你会得到一个绑定列表,其中包括适用于 re-builder
的所有以 C-c
开头的绑定。 - Trey Jackson尝试使用字符类。 只要您只使用ASCII字符集,就可以使用[[:ascii:]]
代替点号。 使用较长的[[:ascii:][:nonascii:]]
应该适用于所有内容。