如何使用CMake string正则替换提取多路径末尾部分并替换全路径
解决方案
错误原因分析
- 原正则使用了贪婪匹配符
.*,会一次性匹配整行中最长的符合规则的字符串,会跨多个路径片段吞噬中间的有效文件名,导致替换结果不符合预期 - 特意匹配
\./的逻辑属于不必要的限制,不管中间路径是否包含相对路径标识./,我们只需要统一移除路径前缀即可,额外限制反而会导致部分路径匹配失败 - CMake字符串中反斜杠需要双重转义,原写法中的
\.在CMake解析阶段会直接变成普通字符.,也会影响匹配效果
正确实现代码
string(REGEX REPLACE "C:/Users/mycode/[^;]*/" "" TEMP "${inputfilecontent}")
逻辑说明
正则模式C:/Users/mycode/[^;]*/的匹配规则:
- 匹配以
C:/Users/mycode/开头的路径前缀 [^;]*匹配所有非分号的字符,确保不会跨多个分号分隔的路径片段匹配,避免贪婪匹配问题- 匹配到最后一个
/为止,刚好覆盖所有需要移除的路径前缀部分 - 替换为空之后,就只会保留每个路径最后的文件名,同时开头的
TESTA:/TESTB:/TESTC:标识不会被匹配,会完整保留
内容的提问来源于stack exchange,提问作者deb
相关产品推荐
相关产品推荐

