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

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

本文关键字:我的 c++ 代码 不匹配 正则表达式 pcregrep 为什么      更新时间:2023-10-16

我有一个正则表达式,可以完美地与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或更多,所以我认为第一个正则表达式是第二个的子集。

不明显的区别是,文件是否以翻译的模式打开是未知的。

通常可以用r?n代替n来覆盖所有情况。
(甚至是(?:r?n|r))。

因此,如果您想量化换行符,它将是(?:r?n)+(?:r?n|r)+

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

如果这行不通,那就换个方法。