为什么这个正则表达式在 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 上可用)。
如果这不起作用,那就是别的。
我有一个与 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 上可用)。
如果这不起作用,那就是别的。