编写c ++正则表达式以匹配#include预处理指令

时间:2014-10-21 17:18:06

标签: c++ regex include

我想在c ++中编写一个正则表达式来匹配#include预处理指令。 所以我写了这个:

std::regex includePattern("^[[:blank:]|[:space:]]*#[[:blank:]|[:space:]]*include[[:blank:]|[:space:]]+[<|\"]{1}[_[:alpha:]]+[_[:alnum:]]*");

这适用于:

std::string matchString = "#include <vector>";

但只匹配字符串的部分内容排除尾随&#34;&gt;&#34;, 但如果我将正则表达式更改为:

std::regex includePattern("^[[:blank:]|[:space:]]*#[[:blank:]|[:space:]]*include[[:blank:]|[:space:]]+[<|\"]{1}[_[:alpha:]]+[_[:alnum:]]*[>|\"]{1}");

它只是没有给我想要的结果,只是告诉我&#34;没找到&#34; !有什么不对吗?

有人可以帮我在c ++中编写一个准确的正则表达式来匹配#include预处理指令吗?

提前致谢!

4 个答案:

答案 0 :(得分:3)

这取决于要匹配的输入是否可能包含新内容 行呢? [[:space:]]将匹配任何空格,包括新空格 除了新行之外,[[:blank:]]行将匹配任何空格 (我不确定标准是否支持)。无论如何, 类似的东西:

"^\\s*#\\s*include\\s+[<\"][^>\"]*[>\"]\\s*"

应该做的,但是......

  • 如果您的来源不应该有新的行,那么它仍然存在 可能会匹配。

  • 如果您的来源已转义新线路,请说明在中间 令牌include或文件名,它将不匹配。 (这是 合法的C ++,但没有一个心智正常的人会这样做。)

  • 如果你的来源有不匹配的分隔符,一端有一个", 如果是另一个<<,它仍会匹配。

  • 它不会在行尾处理评论。处理 C ++样式注释(//)应该只是添加的问题 "(?://.*)?"到表达式的结尾。处理C风格 评论(特别是因为可能有几个)更多一点 复杂。

为确保分隔符匹配,您可能需要放置 包含在or或

之后的所有内容
"^\\s*#\\s*include\\s+(?:<[^>]*>|\"[^\"]*\")\\s*"

同样,您需要添加到最后才能处理评论。

答案 1 :(得分:0)

以下正则表达式将匹配#include

#include <vector>指令
^#include\s+<\w+>$

注意:这不包括#include stdio.h等指令。

答案 2 :(得分:0)

你不是在验证吗? 有一件事,你可以指望在BOL和可能的空间之后出现的包括 并在其右侧用空格分隔。
除此之外,我不会尝试验证右边的问题。

仅使用多行修饰符 -
"(?m)^[^\\S\\r\\n]*#include[^\\S\\r\\n]+(.*?)[^\\S\\r\\n]*"

扩展:

 (?m)
 ^ [^\S\r\n]* 
 \#include
 [^\S\r\n]+ 
 ( .*? )               # (1)
 [^\S\r\n]* 

答案 3 :(得分:0)

如果您需要捕获包含类型<"以及您可以使用的包含文件名:

std::string reg = "\\s*#\\s*include\\s*([<\"])([^>\"]+)([>\"])"; // escaped version

- 或 -

std::string raw = R"reg(\s*#\s*include\s*([<"])([^>"]+)([>"]))reg"; // raw string version

Live Demo

Group 1 = `<` or `"`
Group 2 = file name
Group 3 = `>` or `"`