如何使用 Cmake 字符串正则表达式替换从路径 urls 的多个实例中获取路径 url 的最后一部分并用它替换整个路径
How to use Cmake string regex replace to get last part of path url from multiple instances of path urls and replace the whole path with it
所以我的字符串如下:
TESTA:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTB:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTC:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
我需要的输出是:
TESTA:out_stra.bin;out_strb.bin;out_strc.bin
TESTB:out_stra.bin;out_strb.bin;out_strc.bin
TESTC:out_stra.bin;out_strb.bin;out_strc.bin
我尝试使用字符串正则表达式,但没有得到所需的输出。这是我尝试过的:
string(REGEX REPLACE "C:/Users/mycode/.*/\./.*/"
"" TEMP
<inputfilecontent>)
如有任何帮助,我们将不胜感激。谢谢
正则表达式 .
匹配任何字符,包括分号 (;
) 和换行符 (\n
)。这就是为什么您的正则表达式的 .*
部分与文件的所有中间“记录”相匹配的原因。
因此您需要将正则表达式中的 .
替换为 [^;\n]
,这与您记录的分隔符不匹配:
string(REGEX REPLACE "C:/Users/mycode/[^;\n]*/\./[^;\n]*/"
"" TEMP
"<inputfilecontent>")
另请注意,您需要将文件内容括在 双引号 中。问题是您的文件包含分号 ;
,CMake 将其以未引用的形式解释为 参数定界符 .
string(REGEX REPLACE) 的特殊之处在于它连接了所有输入参数,因此如果没有引号,分号将丢失。
可运行示例:
cmake_minimum_required(VERSION 3.10)
project(replace_lines)
set(LINES
[=[
TESTA:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTB:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTC:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
]=]
)
message(STATUS "Lines: ${LINES}")
string(REGEX REPLACE "C:/Users/mycode/[^;\n]*/\./[^;\n]*/"
"" RESULT
"${LINES}"
)
message(STATUS "Result: ${RESULT}")
输出:
-- Lines: TESTA:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTB:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTC:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
-- Result: TESTA:out_stra.bin;out_strb.bin;out_strc.bin
TESTB:out_stra.bin;out_strb.bin;out_strc.bin
TESTC:out_stra.bin;out_strb.bin;out_strc.bin
感谢你们所有的回答,我找到了最终的解决方案,在添加@WiktorStribiżew 解决方案之前必须做一些事情。我不得不做
string(REGEX REPLACE ";" "\\;" output "${input}")
使解决方案与“;”一起工作
所以我的字符串如下:
TESTA:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTB:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTC:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
我需要的输出是:
TESTA:out_stra.bin;out_strb.bin;out_strc.bin
TESTB:out_stra.bin;out_strb.bin;out_strc.bin
TESTC:out_stra.bin;out_strb.bin;out_strc.bin
我尝试使用字符串正则表达式,但没有得到所需的输出。这是我尝试过的:
string(REGEX REPLACE "C:/Users/mycode/.*/\./.*/"
"" TEMP
<inputfilecontent>)
如有任何帮助,我们将不胜感激。谢谢
正则表达式 .
匹配任何字符,包括分号 (;
) 和换行符 (\n
)。这就是为什么您的正则表达式的 .*
部分与文件的所有中间“记录”相匹配的原因。
因此您需要将正则表达式中的 .
替换为 [^;\n]
,这与您记录的分隔符不匹配:
string(REGEX REPLACE "C:/Users/mycode/[^;\n]*/\./[^;\n]*/"
"" TEMP
"<inputfilecontent>")
另请注意,您需要将文件内容括在 双引号 中。问题是您的文件包含分号 ;
,CMake 将其以未引用的形式解释为 参数定界符 .
string(REGEX REPLACE) 的特殊之处在于它连接了所有输入参数,因此如果没有引号,分号将丢失。
可运行示例:
cmake_minimum_required(VERSION 3.10)
project(replace_lines)
set(LINES
[=[
TESTA:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTB:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTC:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
]=]
)
message(STATUS "Lines: ${LINES}")
string(REGEX REPLACE "C:/Users/mycode/[^;\n]*/\./[^;\n]*/"
"" RESULT
"${LINES}"
)
message(STATUS "Result: ${RESULT}")
输出:
-- Lines: TESTA:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTB:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
TESTC:C:/Users/mycode/dir_a/./result_a/out_stra.bin;C:/Users/mycode/dir_b/./result_b/out_strb.bin;C:/Users/mycode/dir_c/./result_c/out_strc.bin
-- Result: TESTA:out_stra.bin;out_strb.bin;out_strc.bin
TESTB:out_stra.bin;out_strb.bin;out_strc.bin
TESTC:out_stra.bin;out_strb.bin;out_strc.bin
感谢你们所有的回答,我找到了最终的解决方案,在添加@WiktorStribiżew 解决方案之前必须做一些事情。我不得不做
string(REGEX REPLACE ";" "\\;" output "${input}")
使解决方案与“;”一起工作