【发布时间】:2014-10-22 17:10:25
【问题描述】:
我想用 C++ 编写一个正则表达式来匹配 #include 预处理指令。 所以我写了这个:
std::regex includePattern("^[[:blank:]|[:space:]]*#[[:blank:]|[:space:]]*include[[:blank:]|[:space:]]+[<|\"]{1}[_[:alpha:]]+[_[:alnum:]]*");
这适用于:
std::string matchString = "#include <vector>";
但只匹配字符串的一部分,不包括结尾的“>”, 但如果我将正则表达式更改为:
std::regex includePattern("^[[:blank:]|[:space:]]*#[[:blank:]|[:space:]]*include[[:blank:]|[:space:]]+[<|\"]{1}[_[:alpha:]]+[_[:alnum:]]*[>|\"]{1}");
它不会给我想要的结果,只是告诉我“找不到”!有什么问题吗?
谁能帮我用 C++ 编写一个准确的正则表达式来匹配 #include 预处理指令?
提前致谢!
【问题讨论】:
-
使用 or 或
[[:space:]]和[[:blank:]]是没有意义的:匹配[[:blank:]]的所有内容也匹配[[:space:]]。 -
另外,将
{1}放在字符类之后是没有意义的;这是默认设置。 -
而且您不应该将
|放在字符类中。一个字符类是一个或;在字符类中,|按字面意思处理。 (这些都不能解释为什么你的第二个表达式不起作用。) -
#includes可能会被遮挡,隐藏在 cmets/* */中。除非你同时处理 cmets,否则你永远不会知道。