编写c++正则表达式以匹配#include预处理指令
Write c++ regular expression to match a #include preprocessing directive
我想用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预处理指令吗?
提前感谢!
这取决于要匹配的输入是否包含新的线[[:space:]]
将匹配任何空白,包括新空白行,[[:blank:]]
将匹配除新行之外的任何空白(我不确定它是否得到了标准的支持)。无论如何类似于:
"^\s*#\s*include\s+[<"][^>"]*[>"]\s*"
应该做的把戏,但是。。。
如果你的源代码有不该有的新行,它仍然可能匹配。
如果你的来源逃脱了新的行,说在中间令牌
include
或文件名,它将不匹配。(这是合法的C++,但没有一个头脑正常的人会这么做。)如果您的源具有不匹配的分隔符,一端为
"
,而在另一个是<
或<
,则它仍然匹配。它不处理行末尾的注释。处理C++风格的注释(
//
)应该只是添加CCD_ 8添加到表达式末尾。处理C风格评论(特别是因为可能有几个)有点多复杂的
为了确保分隔符匹配,您可能需要包含在或中之后的所有内容:
"^\s*#\s*include\s+(?:<[^>]*>|"[^"]*")\s*"
同样,您需要添加到末尾以处理注释。
如果需要捕获包含类型<
或"
以及包含的文件名,可以使用:
std::string reg = "\s*#\s*include\s*([<"])([^>"]+)([>"])"; // escaped version
-或-
std::string raw = R"reg(s*#s*includes*([<"])([^>"]+)([>"]))reg"; // raw string version
实时演示
Group 1 = `<` or `"`
Group 2 = file name
Group 3 = `>` or `"`
您没有进行验证,是吗
有一件事,你可以指望在BOL和可能的空格后面有include
并在其右侧用空格分隔
除此之外,我不会试图验证右边的内容。
仅使用多行修饰符-"(?m)^[^\S\r\n]*#include[^\S\r\n]+(.*?)[^\S\r\n]*"
扩展:
(?m)
^ [^Srn]*
#include
[^Srn]+
( .*? ) # (1)
[^Srn]*
以下正则表达式将匹配#include
指令,如#include <vector>
^#includes+<w+>$
注意:这不包括#include stdio.h
之类的指令。
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- #define xyz在#include预编译标题之前
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- 如何在大型项目中预处理具有多个 #include 文件的单个源文件
- 编写c++正则表达式以匹配#include预处理指令
- g++错误:预处理指令#INCLUDE无效