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

Write c++ regular expression to match a #include preprocessing directive

本文关键字:#include 预处理 指令 c++ 正则表达式 编写      更新时间:2023-10-16

我想用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之类的指令。