gpt4 book ai didi

regex - 如何在 CMake 中删除字符串中的一行文本,解决 CMake 缺乏基于行的正则表达式匹配的问题?

转载 作者:行者123 更新时间:2023-12-04 10:50:33 28 4
gpt4 key购买 nike

我发现 CMake 没有按照我预期的方式执行 RegEx。 Apparently, others have had this same problem as well.问题是 CMake 不是基于行的。当您使用 ^$运算符,它们作用于整个字符串,而不是行的开头和结尾。

我正在尝试删除文件中显示 #include <blah.h> 的所有行或 #include "blah.h" .

为此,我创建了一个小函数:

function(deleteinplace IN_FILE pattern)
file(READ ${IN_FILE} CONTENTS)
string(REGEX REPLACE ${pattern} "" STRIPPED ${CONTENTS})
file(WRITE ${IN_FILE} "${STRIPPED}")
endfunction()

然后调用它:
deleteinplace(myfile.h "\#include.*\n")
这最终会在字符串匹配后删除文件中的所有内容。

非贪婪技巧,如 .*?出于某种原因不能在 CMake 中工作。其他技巧,如 \r?\n也不行。

我需要解决这个问题。

最佳答案

诀窍是不是 使用 file(READ ...) ,但是 file(STRINGS ....) .这会让 CMake逐行读取文件,并根据您的需要返回一个字符串列表,每个字符串代表一行。使用这种方法,您的函数将如下所示:

function(deleteinplace IN_FILE pattern)
# create list of lines form the contens of a file
file (STRINGS ${IN_FILE} LINES)

# overwrite the file....
file(WRITE ${IN_FILE} "")

# loop through the lines,
# remove unwanted parts
# and write the (changed) line ...
foreach(LINE IN LISTS LINES)
string(REGEX REPLACE ${pattern} "" STRIPPED "${LINE}")
file(APPEND ${IN_FILE} "${STRIPPED}\n")
endforeach()
endfunction()


然后调用它:
deleteinplace(myfile.h "\#include.*")

请注意,在此示例中 \n作为 file(STRINGS ....) 的一部分自动从行中剥离声明,并在 file(APPEND ....) 内添加回来陈述;因此, \n调用函数时也从搜索模式中删除。

最后,这里是关于 file(STRINGS ...) 的文档

关于regex - 如何在 CMake 中删除字符串中的一行文本,解决 CMake 缺乏基于行的正则表达式匹配的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59494184/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com