You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中如何替换列表内每个字符串的前两个字符为“00”?

问题原因

你遇到的问题是因为CMake的list(TRANSFORM ... REPLACE)默认执行全局正则替换,若正则表达式未正确锚定或存在多次匹配可能,就会重复替换。在你的案例中,^锚点未按预期生效(可能是CMake版本的正则行为差异),导致..匹配了字符串中所有两个字符的组合——比如ABCD里的AB和CD都被替换成00,最终得到0000。

解决方法

以下两种可靠写法可实现需求:

方法1:使用捕获组明确保留后半部分

通过正则捕获组拆分字符串的前两个字符与剩余部分,替换时仅替换前两个字符,保留后续内容:

set(THINGS ABCD DEFG HIJK)
list(TRANSFORM THINGS REPLACE "^(..)(.*)$" "00\\2" OUTPUT_VARIABLE MANGLED_THINGS)
message(SEND_ERROR "Mangled: ${MANGLED_THINGS}")

其中^(..)(.*)$的捕获逻辑:

  • (..):匹配字符串开头的任意两个字符
  • (.*):匹配字符串剩余的所有内容
    替换为00\\2即表示用00替换第一个捕获组,保留第二个捕获组的内容。

方法2:限制替换次数为1

通过LIMIT_COUNT 1参数强制只执行一次替换,确保仅替换开头的两个字符:

set(THINGS ABCD DEFG HIJK)
list(TRANSFORM THINGS REPLACE "^.." "00" LIMIT_COUNT 1 OUTPUT_VARIABLE MANGLED_THINGS)
message(SEND_ERROR "Mangled: ${MANGLED_THINGS}")

LIMIT_COUNT 1会告诉CMake只替换第一次匹配的内容,即便正则表达式存在多次匹配可能,也只会处理开头的两个字符。

两种方法都能得到你预期的结果:00CD;00FG;00JK

内容的提问来源于stack exchange,提问作者thomasa88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:03:32