1

我有一个与以下完美配合的正则表达式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)
{

为什么它可以在 C++ 代码中使用pcregrep而不是在 C++ 代码中使用?

4

1 回答 1

1

你的第一个正则表达式:

 ( [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)+or (?:\r?\n|\r)+

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

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

于 2015-08-10T17:22:53.297 回答