我想在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预处理指令吗?
提前致谢!
答案 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
Group 1 = `<` or `"`
Group 2 = file name
Group 3 = `>` or `"`