【CMake 语法】(8) CMake 字符串操作

概要(Synopsis)

Search and Replace
  string(FIND <string> <substring> <out-var> [...])
  string(REPLACE <match-string> <replace-string> <out-var> <input>...)
  string(REGEX MATCH <match-regex> <out-var> <input>...)
  string(REGEX MATCHALL <match-regex> <out-var> <input>...)
  string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)

Manipulation
  string(APPEND <string-var> [<input>...])
  string(PREPEND <string-var> [<input>...])
  string(CONCAT <out-var> [<input>...])
  string(JOIN <glue> <out-var> [<input>...])
  string(TOLOWER <string> <out-var>)
  string(TOUPPER <string> <out-var>)
  string(LENGTH <string> <out-var>)
  string(SUBSTRING <string> <begin> <length> <out-var>)
  string(STRIP <string> <out-var>)
  string(GENEX_STRIP <string> <out-var>)
  string(REPEAT <string> <count> <out-var>)

Comparison
  string(COMPARE <op> <string1> <string2> <out-var>)

Hashing
  string(<HASH> <out-var> <input>)

Generation
  string(ASCII <number>... <out-var>)
  string(HEX <string> <out-var>)
  string(CONFIGURE <string> <out-var> [...])
  string(MAKE_C_IDENTIFIER <string> <out-var>)
  string(RANDOM [<option>...] <out-var>)
  string(TIMESTAMP <out-var> [<format string>] [UTC])
  string(UUID <out-var> ...)

JSON
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         {GET | TYPE | LENGTH | REMOVE}
         <json-string> <member|index> [<member|index> ...])
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         MEMBER <json-string>
         [<member|index> ...] <index>)
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         SET <json-string>
         <member|index> [<member|index> ...] <value>)
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         EQUAL <json-string1> <json-string2>)

注意: <string> 不是字符串变量,而是字符串值。
注意: <string-var> 是字符串变量。

搜索和替换 (Search and Replace)

例如:

set(S 
"Pride and Prejudice is kind of a literary Rosetta Stone, the inspiration, basis, and model for so many modern novels. \
You’re probably more familiar with its plot and characters than you think. \
For a book written in the early 19th century, it’s modernity is surprising only until you realize that this is the novel that in many ways defined what a modern novel is.")
message("S: ${S}")

用纯字符串搜索和替换 (Search and Replace With Plain Strings)

string(FIND <string> <substring> <out-var> [...])
string(FIND <string> <substring> <output_variable> [REVERSE])

查找字符串的子串位置。

返回字符串 <string> 中给定 子串 <substring> 的第一次出现的位置。
如果使用了 REVERSE 标志,逆向搜索,表示最后一次出现子串的位置。
如果未找到子串 <substring>,则返回 -1。
string(FIND) 子命令将所有字符串视为 ASCII 字符。
<output_variable> 将结果索引存储在该变量中。

例如,string(FIND ${S} "in" S_index) 查找子串 in 所在索引,并且将索引值保存在 S_index 变量中。

string(REPLACE <match-string> <replace-string> <out-var> <input>...)
string(REPLACE <match_string> <replace_string> <output_variable> <input> [<input>...])

将输入字符串 <input> 中所有出现的 <match-string> 替换为 <replace_string>,并将结果存储在 <output_variable> 中。

例如,string(REPLACE "in" "out" S_out_var ${S}) 将字符串中的所有字符 in 替换为 out

用正则表达式搜索和替换 (Search and Replace With Regular Expressions)

string(REGEX MATCH <match-regex> <out-var> <input>...)
string(REGEX MATCH <regular_expression> <output_variable> <input> [<input>...])

根据正则表达式匹配一次。
将所有输入字符串 <input> 在匹配之前都连接在一起,然后根据正则表达式 <regular_expression> 匹配一次,将该结果存储在 <output_variable>

例如,string(REGEX MATCH "[A-Za-z]*in[A-Za-z]*" S_out_var ${S}) 匹配带有字符 in 的单词。

string(REGEX MATCHALL <match-regex> <out-var> <input>...)
string(REGEX MATCHALL <regular_expression> <output_variable> <input> [<input>...])

根据正则表达式尽可能匹配。
将所有输入字符串 <input> 在匹配之前都连接在一起,然后根据正则表达式 <regular_expression> 尽可能匹配,将所有结果存储在 <output_variable>

例如,string(REGEX MATCHALL "[A-Za-z]*in[A-Za-z]*" S_out_var ${S}) 尽可能带有字符 in 的单词。

string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)
string(REGEX REPLACE <regular_expression> <replacement_expression> <output_variable> <input> [<input>...])

根据正则表达式替换。
将所有输入字符串 <input> 在匹配之前都连接在一起,然后尽可能匹配 <regular_expression> 并替换为 <replacement_expression>,将结果存储在 <output_variable>

例如,string(REGEX REPLACE "[A-Za-z]*in[A-Za-z]*" "hello" S_out_var ${S}) 尽可能带有字符 in 的单词 替换为 字符 hello

<replacement_expression> 可以使用 \1, \2, …, \9 来引用括号匹配子表达式。请注意,CMake 代码中需要两个反斜杠 \\1 才能通过参数解析获取反斜杠 \

例如,string(REGEX REPLACE "([A-Za-z]*in[A-Za-z]*)" "\\1_hello" S_out_var ${S}) 尽可能带有字符 in 的单词,增加后缀 _hello

正则表达式规范 (Regex Specification)

特殊字符

  • ^: 匹配输入开头
  • $: 匹配输入结束
  • .: 匹配任意单个字符
  • \<char>: 匹配单字符 <char>。使用它来匹配特殊的正则表达式字符,例如 \. 表示点,\\ 表示反斜杠,\a 表示 a
  • [ ]: 匹配任何在括号内的字符
  • [^ ]: 匹配任何不在括号内的字符
  • -: 在方括号内,指定字符的范围,例如 [a-f] 表示 [abcdef][0-3] 表示 [0123][+*/-] 表示数学运算符。
  • *: 匹配前面模式的零次或多次
  • +: 匹配前面模式的一次或多次
  • ?: 匹配前面模式的零次或一次
  • |: 匹配 | 两侧的模式
  • (): 保存匹配的子表达式(模式),可以在 REGEX REPLACE 操作中引用。此外,它由所有与正则表达式相关的命令保存,包括 例如 if(MATCHES),在变量 CMAKE_MATCH_<n><n>0..9

*, +? 具有比 | 比 串联(concatenation) 有更高的优先级。
| 比 串联(concatenation) 有更低的优先级。
这意味着,正则表达式 ^ab+d$,匹配 abbd,但不匹配 ababd。正则表达式 ^(ab|cd)$,匹配 ab,但不匹配 abd

CMake 语言转义序列 例如 \t, \r, \n, 和 \\ 可用于构造制表符, 回车符, 换行符 和 反斜杠 表示正则表达式。例如:

  • 带引号参数 "[ \t\r\n]" 指定匹配任何单个空白字符的正则表达式。
  • 带引号参数 "[/\\]" 指定匹配斜杠和反斜杠的正则表达式。
  • 带引号参数 "[A-Za-z0-9_]" 指定匹配 C 语言环境中任何单个"单词"字符的正则表达式。
  • 带引号参数 "\\(\\a\\+b\\)" 指定了一个匹配确切字符串 (a+b) 的正则表达式。

操纵 (Manipulation)

string(APPEND <string-var> [<input>...])
string(APPEND <string_variable> [<input>...])

将所有字符串 <input> 附加到变量 <string_variable> 末尾。

例如,string(APPEND S " Stone") 将字符串 Stone 附加到变量 S 末尾

string(PREPEND <string-var> [<input>...])
string(PREPEND <string_variable> [<input>...])

将所有字符串 <input> 添加到变量 <string_variable> 首部。

例如,string(PREPEND S "Stone ") 将字符串 Stone 附加到变量 S 首部

string(CONCAT <out-var> [<input>...])
string(CONCAT <output_variable> [<input>...])

将所有字符串 <input> 连接在一起,并将结果存储在变量 <output_variable>

例如,string(CONCAT S_out "Rosetta" " Stone") 将字符串 RosettaStone 连接在一起,并将结果存储在变量 S_out

string(JOIN <glue> <out-var> [<input>...])
string(JOIN <glue> <output_variable> [<input>...])

使用 <glue> 字符,将所有字符串 <input> 连接在一起,并将结果存储在变量 <output_variable>

例如,string(CONCAT " " S_out "Rosetta" "Stone") 使用字符空格字符,将字符串 RosettaStone 连接在一起,并将结果存储在变量 S_out

string(TOLOWER <string> <out-var>)
string(TOLOWER <string> <output_variable>)

将字符串 <string> 转换为小写的字符。

例如,string(TOLOWER "Hello" S_out) 将字符串 Hello 转换为小写

string(TOUPPER <string> <out-var>)
string(TOUPPER <string> <output_variable>)

将字符串 <string> 转换为大写的字符。

例如,string(TOUPPER "Hello" S_out) 将字符串 Hello 转换为大写

string(LENGTH <string> <out-var>)
string(LENGTH <string> <output_variable>)

计算字符串 <string> 的长度,并将结果存储到变量 <output_variable>

例如,string(LENGTH "Hello" S_len) 计算字符串 Hello 的长度

string(SUBSTRING <string> <begin> <length> <out-var>)
string(SUBSTRING <string> <begin> <length> <output_variable>)

将字符串 <string> 的子串存储在变量 <output_variable> 中。子串是从 begin 索引开始,长度为 <length>

例如,string(SUBSTRING "Hello World" 2 5 S_sub) 将字符串 Hello World,获取索引 2,长度 5 的子串 llo W

string(STRIP <string> <out-var>)
string(STRIP <string> <output_variable>)

删除字符串 <string> 前导和尾随空格,将结果存储在变量 <output_variable> 中。

例如,string(STRIP " Hello World " S_out) 删除字符串 Hello World 前导和尾随空格

string(GENEX_STRIP <string> <out-var>)
string(GENEX_STRIP <string> <output_variable>)

Strip any generator expressions from the input and store the result in the <output_variable>.
https://cmake.org/cmake/help/v3.19/manual/cmake-generator-expressions.7.html

string(REPEAT <string> <count> <out-var>)
string(REPEAT <string> <count> <output_variable>)

产生字符串 <string> 的重复次数 <count>,将结果存储在变量 <output_variable> 中。

例如,string(REPEAT "Hello" 3 S_out) 产生的字符串为 HelloHelloHello

比较 (Comparison)

string(COMPARE <op> <string1> <string2> <out-var>)
string(COMPARE LESS <string1> <string2> <output_variable>)
string(COMPARE GREATER <string1> <string2> <output_variable>)
string(COMPARE EQUAL <string1> <string2> <output_variable>)
string(COMPARE NOTEQUAL <string1> <string2> <output_variable>)
string(COMPARE LESS_EQUAL <string1> <string2> <output_variable>)
string(COMPARE GREATER_EQUAL <string1> <string2> <output_variable>)

比较字符串,并将结果 truefalse 存储在变量 <output_variable> 中。

注意:比较大小写敏感。

例如,string(COMPARE LESS "Hello" "hello" S_out) 字符串 Hellohello 小。

哈希 (Hashing)

string(<HASH> <out-var> <input>)
string(<HASH> <output_variable> <input>)

计算字符串 <input> 的哈希值。支持 <HASH> 算法的名称是:

MD5: 消息摘要算法(Message-Digest Algorithm) 5, RFC 1321.
SHA1: 美国安全散列算法(US Secure Hash Algorithm) 1, RFC 3174.
SHA224: US Secure Hash Algorithms, RFC 4634.
SHA256: US Secure Hash Algorithms, RFC 4634.
SHA384: US Secure Hash Algorithms, RFC 4634.
SHA512: US Secure Hash Algorithms, RFC 4634.
SHA3_224: Keccak SHA-3.
SHA3_256: Keccak SHA-3.
SHA3_384: Keccak SHA-3.
SHA3_512: Keccak SHA-3.

例如,简单用一些哈希算法计算文本的哈希值。

set(S "Hello World")
string(MD5 S_md5 ${S})
message("S_md5: ${S_md5}")
string(SHA1 S_sha1 ${S})
message("S_sha1: ${S_sha1}")
string(SHA256 S_sha256 ${S})
message("S_sha256: ${S_sha256}")

产生 (Generation)

string(ASCII <number>... <out-var>)
string(ASCII <number> [<number> ...] <output_variable>)

将所有数字转换为响应的 ASCII 字符。

string(HEX <string> <out-var>)
string(HEX <string> <output_variable>)

将字符串中每个字节转换为十六进制表示。

string(CONFIGURE <string> <out-var> [...])
string(CONFIGURE <string> <output_variable> [@ONLY] [ESCAPE_QUOTES])

configure_file() 一样的规则转换 <string>

例子,将 configure 字符串根据规则替换

set(VAR 1)
string(CONFIGURE "#cmakedefine VAR @VAR@" S_out)
message("S_out: ${S_out}")
string(MAKE_C_IDENTIFIER <string> <out-var>)
string(MAKE_C_IDENTIFIER <string> <output_variable>)

将字符串转换为标识符。将字符串中的每个非字母数字字符转换为下划线。

string(RANDOM [<option>...] <out-var>)
string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output_variable>)

给定字符组 <alphabet> 和 长度 <length> 产生随机的字符串。默认长度为 5,默认字符组为所有数字和大小写字母。

如果给出整数 RANDOM_SEED,则其值将用于为随机数生成器提供种子。

例子,产生长度为 12 的随机字符串

set(CHARs "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#@!")
string(RANDOM LENGTH 12 ALPHABET ${CHARs} S_out)
message("S_out: ${S_out}")
string(TIMESTAMP <out-var> [<format string>] [UTC])
string(TIMESTAMP <output_variable> [<format_string>] [UTC])

将当前日期和时间的字符串,存储到变量 <output_variable>

UTC 表示采用协调世界时(UTC),而不是本地时间

<format_string> 表示格式化日期和时间,格式符说明:

%%        A literal percent sign (%).
%d        The day of the current month (01-31).
%H        The hour on a 24-hour clock (00-23).
%I        The hour on a 12-hour clock (01-12).
%j        The day of the current year (001-366).
%m        The month of the current year (01-12).
%b        Abbreviated month name (e.g. Oct).
%B        Full month name (e.g. October).
%M        The minute of the current hour (00-59).
%s        Seconds since midnight (UTC) 1-Jan-1970 (UNIX time).
%S        The second of the current minute. 60 represents a leap second. (00-60)
%U        The week number of the current year (00-53).
%w        The day of the current week. 0 is Sunday. (0-6)
%a        Abbreviated weekday name (e.g. Fri).
%A        Full weekday name (e.g. Friday).
%y        The last two digits of the current year (00-99)
%Y        The current year.

如果未给出明确的 <format_string>,它将默认为:

%Y-%m-%dT%H:%M:%S    for local time.
%Y-%m-%dT%H:%M:%SZ   for UTC.
string(UUID <out-var> ...)
string(UUID <output_variable> NAMESPACE <namespace> NAME <name> TYPE <MD5|SHA1> [UPPER])

根据 RFC4122,基于 <namespace><name> 的组合值的哈希运算,并创建一个通用唯一标识符(UUID 又名为 GUID)。
哈希算法是 MD5(版本 3 UUID)SHA1(版本 5 UUID)
UUID 格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个 x 代表一个小写十六进制字符。
UPPER 表示用大写表示。

例子,运行单元测试 Uuid.cmake(https://github.com/Kitware/CMake/blob/master/Tests/RunCMake/string/Uuid.cmake)

set(UUID_DNS_NAMESPACE 6ba7b810-9dad-11d1-80b4-00c04fd430c8)
string(
    UUID WWW_EXAMPLE_COM_MD5_UUID 
    NAMESPACE ${UUID_DNS_NAMESPACE} 
    NAME "www.example.com" 
    TYPE MD5
)
string(
    UUID WWW_EXAMPLE_COM_SHA1_UUID 
    NAMESPACE ${UUID_DNS_NAMESPACE} 
    NAME "www.example.com" 
    TYPE SHA1 UPPER
)
message("WWW_EXAMPLE_COM_MD5_UUID: ${WWW_EXAMPLE_COM_MD5_UUID}")
message("WWW_EXAMPLE_COM_SHA1_UUID: ${WWW_EXAMPLE_COM_SHA1_UUID}")

JSON

查询 JSON 字符串的功能。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       GET <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       GET <json-string> <member|index> [<member|index> ...])

获取 JSON 字符串的元素。
Arrayobject 元素将返回 JSON 字符串。
Boolean 元素将返回 ONOFF
Null 元素返回一个空字符串。
Numberstring 返回一个字符串。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       TYPE <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       TYPE <json-string> <member|index> [<member|index> ...])

获取 JSON 字符串的元素的类型。

输出的类型 <out-var>NULL, NUMBER, STRING, BOOLEAN, ARRAY, 或 OBJECT.

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       MEMBER <json-string> [<member|index> ...] <index>)
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       MEMBER <json-string> [<member|index> ...] <index>)

获取 JSON 字符串指定索引的成员名称。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       LENGTH <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       LENGTH <json-string> <member|index> [<member|index> ...])

获取 JSON 字符串元素的长度。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       REMOVE <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       REMOVE <json-string> <member|index> [<member|index> ...])

从 JSON 字符串中删除一个元素。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       SET <json-string> <member|index> [<member|index> ...] <value>)
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       SET <json-string> <member|index> [<member|index> ...] <value>)

设置 JSON 字符串中元素的值。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       EQUAL <json-string1> <json-string2>)
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       EQUAL <json-string1> <json-string2>)

比较两个 JSON 对象是否相等。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake中的string命令用于处理字符串变量。以下是string命令的所有用法: 1. string(ASCII <value>...) 将给定的ASCII值转换为相应的字符并将其存储在变量中。 2. string(CONFIGURE <output-variable> <input> ...) 使用类似C语言的预处理器语法将输入字符串中的变量替换为相应的值,并将结果存储在输出变量中。 3. string(CONCAT <output-variable> <input>...) 将多个输入字符串连接成一个字符串,并将结果存储在输出变量中。 4. string(FIND <input> <substring> <output-variable> [<start>]) 查找子字符串在输入字符串中的位置,并将结果存储在输出变量中。可选地可以指定搜索开始位置。 5. string(JOIN <glue> <output-variable> <input>...) 将输入字符串列表连接成一个字符串,并在每个字符串之间插入指定的粘合剂字符串,并将结果存储在输出变量中。 6. string(MAKE_C_IDENTIFIER <input> <output-variable>) 将输入字符串转换为C语言标识符,并将结果存储在输出变量中。 7. string(MD5 <input> <output-variable>) 计算给定字符串的MD5哈希值,并将结果存储在输出变量中。 8. string(PREPEND <output-variable> <input>...) 将多个输入字符串连接到现有字符串的前面,并将结果存储在输出变量中。 9. string(RANDOM <length> [<alphabet>] [<output-variable>]) 生成一个随机字符串,并将结果存储在输出变量中。可选地可以指定字符串的长度和字符集。 10. string(REPLACE <match> <replace> <output-variable> <input>...) 将输入字符串中所有匹配的子字符串替换为指定的替换字符串,并将结果存储在输出变量中。 11. string(SHA1 <input> <output-variable>) 计算给定字符串的SHA1哈希值,并将结果存储在输出变量中。 12. string(SHA224 <input> <output-variable>) 计算给定字符串的SHA224哈希值,并将结果存储在输出变量中。 13. string(SHA256 <input> <output-variable>) 计算给定字符串的SHA256哈希值,并将结果存储在输出变量中。 14. string(SHA384 <input> <output-variable>) 计算给定字符串的SHA384哈希值,并将结果存储在输出变量中。 15. string(SHA512 <input> <output-variable>) 计算给定字符串的SHA512哈希值,并将结果存储在输出变量中。 16. string(SUBSTRING <output-variable> <input> <start> <length>) 从输入字符串中提取子字符串,并将结果存储在输出变量中。可选地可以指定子字符串的起始位置和长度。 17. string(TOLOWER <output-variable> <input>) 将输入字符串转换为小写,并将结果存储在输出变量中。 18. string(TOUPPER <output-variable> <input>) 将输入字符串转换为大写,并将结果存储在输出变量中。 以上就是CMake中string命令的所有用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值