为什么这个正则表达式在 pcregrep 中匹配,但在我的 C++ 代码中却不匹配?

Why does this regular expression match in pcregrep but not within my c++ code?

我有一个与 pcregrep 完美配合的正则表达式:

pcregrep -M '([a-zA-Z0-9_&*]+)(\(+)([a-zA-Z0-9_ &\*]+)(\)+)(\n)(\{)'

现在我尝试在我的 C++ 代码中包含此正则表达式,但它不匹配(包括转义):

char const *regex = "([a-zA-Z0-9_&*]+)\(+([a-zA-Z0-9_ &\*]+)\)+(?>\n+)\{+";
re = pcre_compile(regex, PCRE_MULTILINE, &error, &erroffset, 0);

我正试图找到这样的函数体(段落是 0a 的十六进制):

my_function(char *str)
{

为什么它适用于 pcregrep 而不是在 C++ 代码中?

你的第一个正则表达式:

 ( [a-zA-Z0-9_&*]+ )           # (1)
 ( \(+ )                       # (2)
 ( [a-zA-Z0-9_ &\*]+ )         # (3)
 ( \)+ )                       # (4)
 ( \n )                        # (5)
 ( \{ )                        # (6)

你的第二个正则表达式:

 ( [a-zA-Z0-9_&*]+ )           # (1)
 \(+
 ( [a-zA-Z0-9_ &\*]+ )         # (2)
 \)+
 (?> \n+ )
 \{+

除了不同的捕获基团和不必要的原子团 (?>)

有一点明显不同:

第二个正则表达式中的最后一个换行符和花括号有 + 个量词。
但那是 1 或更多,所以我认为第一个正则表达式将是第二个正则表达式的子集。

不明显的区别是不知道文件是否以 translated 模式打开。

您通常可以用 \r?\n 代替 \n 涵盖所有情况。
(甚至 (?:\r?\n|\r) )。

因此,如果要量化换行符,则为(?:\r?\n)+(?:\r?\n|\r)+

另一种选择可能是尝试换行符构造(我认为它 \R
相反(在最新版本的 pcre 上可用)。

如果这不起作用,那就是别的。