CMake string用法

string(REPLACE "]" "CLOSEBRACKET" PATCHED_LIST "${PATCHED_LIST}") 是 CMake 里 string 命令的一种使用方式。下面来详细剖析这条命令:

  • string:这是 CMake 里用于处理字符串的命令,能执行各类字符串操作。
  • REPLACE:这是 string 命令的一个操作模式,其作用是把字符串里特定的子字符串替换成别的字符串。
  • "]":代表要被替换掉的子字符串,在这个例子中就是右方括号 ]
  • "CLOSEBRACKET":表示用来替换的新字符串。
  • PATCHED_LIST:为存储替换后结果的变量名。
  • "${PATCHED_LIST}":是包含待替换内容的字符串,这里引用了变量 PATCHED_LIST 的值。

综合来看,这条命令的功能是把变量 PATCHED_LIST 里所有的右方括号 ] 替换成字符串 "CLOSEBRACKET",并将替换后的结果存回变量 PATCHED_LIST 中。

string 命令的用法及示例

string 命令有多种操作模式,下面是一些常见模式的用法和示例:

1. REPLACE(替换子字符串)
# 原始字符串
set(original_string "Hello]World]")
# 执行替换操作
string(REPLACE "]" "!" new_string "${original_string}")
# 输出替换后的字符串
message("Original: ${original_string}")
message("New: ${new_string}")

解释:此示例把字符串 "Hello]World]" 里的所有右方括号 ] 替换成感叹号 !,并将结果存储在变量 new_string 中。

2. FIND(查找子字符串的位置)
# 原始字符串
set(search_string "HelloWorld")
# 查找子字符串 "World" 的位置
string(FIND "${search_string}" "World" position)
# 输出位置
message("Position of 'World': ${position}")

解释:这个例子查找字符串 "World""HelloWorld" 里的起始位置,然后把位置信息存储在变量 position 中。

3. SUBSTRING(提取子字符串)
# 原始字符串
set(long_string "abcdefgh")
# 提取从索引 2 开始、长度为 3 的子字符串
string(SUBSTRING "${long_string}" 2 3 sub_string)
# 输出子字符串
message("Substring: ${sub_string}")

解释:该示例从字符串 "abcdefgh" 中提取从索引 2 开始、长度为 3 的子字符串,并将其存储在变量 sub_string 中。

4. TOUPPERTOLOWER(大小写转换)
# 原始字符串
set(mixed_case "HelloWorld")
# 转换为大写
string(TOUPPER "${mixed_case}" upper_case)
# 转换为小写
string(TOLOWER "${mixed_case}" lower_case)
# 输出转换后的字符串
message("Upper case: ${upper_case}")
message("Lower case: ${lower_case}")

解释:此示例分别把字符串 "HelloWorld" 转换为大写和小写形式,并将结果分别存储在变量 upper_caselower_case 中。

整体功能概述

string(REGEX MATCH "[^=]+" CONF_VARIABLE_NAME "${CONFIG}") 是 CMake 中 string 命令结合正则表达式的用法。它的主要功能是在字符串 ${CONFIG} 里查找符合指定正则表达式模式 [^=]+ 的第一个匹配项,并把这个匹配结果存储到变量 CONF_VARIABLE_NAME 中。

代码逐行解释

string(REGEX MATCH "[^=]+" CONF_VARIABLE_NAME "${CONFIG}")
  • string:这是 CMake 里用于处理字符串的命令。
  • REGEX:代表使用正则表达式进行字符串操作。正则表达式是一种强大的文本匹配工具,能按照特定模式来查找、替换或验证字符串。
  • MATCH:这是 string 命令在 REGEX 模式下的一个操作选项,其作用是在字符串里查找符合正则表达式模式的第一个匹配项。
  • [^=]+:这是具体的正则表达式模式。
    • [^ ] 是一个字符类,表示匹配除了方括号内指定字符之外的任意字符。在这里,[^=] 意味着匹配除了等号 = 之外的任意字符。
    • + 是一个量词,表示前面的元素(这里是 [^=])可以出现一次或多次。所以 [^=]+ 整体表示匹配一个或多个非等号字符的序列。
  • CONF_VARIABLE_NAME:是用来存储匹配结果的变量名。如果找到了匹配项,匹配结果会被存到这个变量中;若没找到,变量会被设为空字符串。
  • "${CONFIG}":这是要进行匹配操作的目标字符串,它引用了变量 CONFIG 的值。

示例

下面是一个简单的示例,展示了这个命令的实际使用:

# 设置 CONFIG 变量的值
set(CONFIG "key=value")
# 使用正则表达式匹配非等号字符序列
string(REGEX MATCH "[^=]+" CONF_VARIABLE_NAME "${CONFIG}")
# 输出匹配结果
message("Matched value: ${CONF_VARIABLE_NAME}")

在这个示例中,变量 CONFIG 的值为 "key=value"。正则表达式 [^=]+ 会匹配到 "key",因为 "key" 是字符串中第一个连续的非等号字符序列。最后,"key" 会被存储到变量 CONF_VARIABLE_NAME 中,并通过 message 命令输出。

string(REGEX ...) 其他常见操作

除了 MATCHstring(REGEX ...) 还有其他常见操作:

REPLACE

用于使用正则表达式进行字符串替换。例如:

set(input "hello123world")
string(REGEX REPLACE "[0-9]+" "" output "${input}")
message("Output: ${output}")

这里会把字符串 "hello123world" 中的所有连续数字替换为空字符串,最终输出 "helloworld"

MATCHALL

MATCH 类似,但它会找出字符串中所有符合正则表达式模式的匹配项。例如:

set(text "a1 b2 c3")
string(REGEX MATCHALL "[a-z][0-9]" matches "${text}")
message("Matches: ${matches}")

这个例子会找出字符串 "a1 b2 c3" 中所有符合 [a-z][0-9] 模式的匹配项,即 "a1""b2""c3",并将它们存储在变量 matches 中。

你可能感兴趣的:(我的博客,cmake)