搜索多行正则表达式

Search for multiline regex

我有几个函数定义如下的源文件。

ReturnType ClassName::
FunctionName(FunctionArgs...)
{
 ....
}

ReturnType ClassName::NestedClassName::
FunctionName(FunctionArgs...)
{
 ....
}

我想 grep 浏览文件并分别列出第一种类型和第二种类型的所有函数。有没有办法在 emacs 中做到这一点? 注意:我试过 [https://emacs.stackexchange.com/questions/9548/what-is-regex-to-match-newline-character] 中的 C-q C-j。没用。

这似乎有两个相互关联的部分:要使用的正则表达式和搜索方法。我正在做以下假设(很抱歉没有事先澄清这些;我没有足够的代表发表评论):

  1. 您有兴趣只收集函数签名(前两行),而不是大括号内的内容。
  2. 冒号从不出现在 return 类型或 class 名称中。
  3. 在函数体内,没有一行以双冒号结束。

在 Emacs 中,我可以用正则表达式区分这两种情况

^[^:]+::\n.+$
^[^:]+::[^:]+::\n.+$

(在交互式用法中,您可以将 \n 替换为实际的换行符(例如,通过 C-q C-j))。

如果您在 Emacs 中打开了所有的缓冲区,您现在可以直接使用 multi-occur。否则,您可以使用 grep 命令调出 grep,或者只使用 M-!直接调用 grep。

如果您使用的是 grep,那么您需要一种不同的方法(或者至少我找不到合适的正则表达式)。如果你放下第二行并使用 -A 1 开关(它告诉 grep 在每次匹配后打印该行),一切似乎都正常工作。出于某种原因,您还需要转义 + 运算符。以下是生成的命令:

grep -A 1 "^[^:]\+::$" files
grep -A 1 "^[^:]\+::[^:]\+::$" files