CMake 正则表达式匹配包含声明中的标头名称
CMake regex match header names in include declarations
我正在尝试获取机器人中所有 #include 声明的标头名称.cpp即,如果我有一个示例.cpp有两个声明:
示例.cpp
#include "MyLib.h"
#include <iosream>
//some code
我想在我的输出中看到这样的东西:
INCLUDE_NAME MyLib.h
INCLUDE_NAME iosream
我有这些robot.cpp
和CMakeLists.txt
文件(它们是简化的):
CMakeList.txt
...
file(STRINGS ${SRC_FILE} SRC_CONTENT) #copy the file content
foreach(SRC_LINE ${SRC_CONTENT})
if("${SRC_LINE }" MATCHES "^ *#include *[<"](.*)[>"]")
message("INCLUDE_NAME ${CMAKE_MATCH_1}")
...
机器人.cpp
#include "ArduinoRobot.h"
#include "EasyTransfer2.h"
void RobotControl::pointTo(int angle){
int target=angle;
uint8_t speed=80;
target=target%360;
if(target<0){
target+=360;
}
int direction=angle;
while(1){
if(direction>0){
motorsWrite(speed,-speed);//right
delay(10);
}else{
motorsWrite(-speed,speed);//left
delay(10);
}
int currentAngle=compassRead();
int diff=target-currentAngle;
if(diff<-180)
diff += 360;
else if(diff> 180)
diff -= 360;
direction=-diff;
if(abs(diff)<5){
motorsWrite(0,0);
return;
}
}
}
然后,如果我在控制台中执行我的 CMakeList.txt,我会得到以下输出:
...
INCLUDE_NAME ArduinoRobot.h"#include "EasyTransfer2.h"void RobotControl::pointTo(int angle){ int target=angle; uint8_t speed=80; target=target%360; if(target<0){ target+=360; } int direction=angle; while(1){ if(direction>0){ motorsWrite(speed,-speed);//right delay(10); }else{ motorsWrite(-speed,speed);//left delay(10); } int currentAngle=compassRead(); int diff=target-currentAngle; if(diff<-180) diff += 360; else if(diff
...
但是,如果我将所有>
符号更改为 <
,结果正常,并且得到以下输出:
...
INCLUDE_NAME ArduinoRobot.h
INCLUDE_NAME EasyTransfer2.h
...
我想这是因为正则表达式,但我不知道如何修复它。
有人吗?
我认为
有两个问题。 第一个,我强烈怀疑,是源代码中的行尾。您的代码会像您最初一样工作,只是您正在解析的代码可能是从某个地方下载的,并且该文件可能具有不同的行尾。 例如,如果原版是在 Linux 下开发的,而您在 Windows 下操作,则可能会发生这种情况。 这需要首先解决。
其次,您真正想要的是一个正则表达式,它不接受中间的任何字符,而只接受与"
或>
不匹配的字符。 这是我刚才测试的内容:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(NONSENSE NONE)
file(STRINGS "silly.txt" SRC_CONTENT)
foreach(SRC_LINE ${SRC_CONTENT})
if("${SRC_LINE}" MATCHES "^[ t]*#[ t]*include[ t]*[<"]([^>"]*)[>"]")
message("INCLUDE_NAME ${CMAKE_MATCH_1}")
endif()
ENDFOREACH()
傻.txt的内容:
# include "foo.h"
#include "bar.h"
#include "ArduinoRobot.h"#include "EasyTransfer2.h"int main()
{
printf("This is not a header.n");
return 0;
}
#include "surprise.h"
请注意,bar.h
行中间和surprise.h
行的开头有一个制表符。 奇怪的是,但仍然被预处理器接受的是foo.h
行上显示的变化,其中#
和指令之间有空格或制表符。 显示的正则表达式处理所有这些。
这是它的输出:
INCLUDE_NAME foo
INCLUDE_NAME bar
INCLUDE_NAME foo.h
INCLUDE_NAME bar.h
INCLUDE_NAME ArduinoRobot.h
INCLUDE_NAME surprise.h
CMake 正则表达式是贪婪的,因此输出。
也许尝试在撇号之间匹配更少的东西:
"^ *#include *[<"](w+)[>"]"
我想知道 CMake 是否接受明确的非贪婪语法,例如
"^ *#include *[<"]\(.*)\[>"]"
(未测试!
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++正则表达式无限循环
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 带有多个字符分隔符的正则表达式
- C++ 使用增强正则表达式库时断言崩溃
- 有人可以帮助我处理正则表达式吗?
- 使用正则表达式获取大括号块的列表
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 组合正则表达式部分使用 | 不起作用的 C++
- 为什么C++正则表达式这么慢?
- 如何使HTML5电子邮件验证正则表达式在C++中工作?
- 在C++中实现正则表达式
- C++正则表达式替换整个单词
- 用C++编写正则表达式的正确方法是什么?
- 如何从Stroustrup的C++书中解释这个正则表达式?
- 为什么这个正则表达式C++在括号表达式中抛出无效范围异常?
- C++:匹配正则表达式,什么是匹配?
- CMake 正则表达式匹配包含声明中的标头名称