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

如何通过foreach从CMake冒号分隔键值的字符串列表提取常量

实现代码

set(MY_LIST "A:1;B:2;C:3")

foreach(ITEM ${MY_LIST})
    # 正则提取冒号前后的键、值,兼容所有CMake 3.x版本
    string(REGEX MATCH "^([^:]+):(.*)$" _MATCHED ${ITEM})
    if(_MATCHED)
        # CMAKE_MATCH_1对应正则第一个括号捕获的内容(键),CMAKE_MATCH_2对应第二个括号的内容(值)
        set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}")
    endif()
endforeach()

# 验证结果,可删除
message(STATUS "A = ${A}")
message(STATUS "B = ${B}")
message(STATUS "C = ${C}")

补充说明

  • 如果需要将变量设为跨CMakeLists可用的全局常量,将set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}")替换为set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "" FORCE)即可
  • 如果你使用的是CMake 3.12及以上版本,也可以用更直观的字符串拆分写法替换正则逻辑:
    string(SPLIT ${ITEM} ":" KEY_VALUE)
    list(GET KEY_VALUE 0 KEY)
    list(GET KEY_VALUE 1 VALUE)
    set(${KEY} "${VALUE}")
    
  • 正则写法的优势是支持值本身包含冒号的场景,比如D:abc:def会被解析为键D,值为abc:def,拆分写法遇到值带冒号的场景会出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:27:05