【CMake 语法】(8) CMake 字符串操作
stringstring(REGEX REPLACE “.+[ \t]${name}[ \t]+([0-9]+)." “\1” name"{name} "name"{KaTeX parse error: Expected 'EOF', got '}' at position 11: {FILE_VAR}}̲")string(REGEX…{VARNAME}[ \t]+"([0-9]+).$” “\1
概要(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") 将字符串 Rosetta 和 Stone 连接在一起,并将结果存储在变量 S_out 中
string(JOIN <glue> <out-var> [<input>...])
string(JOIN <glue> <output_variable> [<input>...])
使用 <glue> 字符,将所有字符串 <input> 连接在一起,并将结果存储在变量 <output_variable>。
例如,string(CONCAT " " S_out "Rosetta" "Stone") 使用字符空格字符,将字符串 Rosetta 和 Stone 连接在一起,并将结果存储在变量 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>)
比较字符串,并将结果 true 或 false 存储在变量 <output_variable> 中。
注意:比较大小写敏感。
例如,string(COMPARE LESS "Hello" "hello" S_out) 字符串 Hello 比 hello 小。
哈希 (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 字符串的元素。Array 和 object 元素将返回 JSON 字符串。Boolean 元素将返回 ON 或 OFF。Null 元素返回一个空字符串。Number 和 string 返回一个字符串。
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 对象是否相等。
更多推荐

所有评论(0)