string¶
字符串操作。
语法¶
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(FIND <string> <substring> <output_variable> [REVERSE])¶
返回在提供的
<string>
中找到给定<substring>
的位置。如果使用了REVERSE
标志,则命令将搜索指定<substring>
的最后一次出现的位置。如果未找到<substring>
,则返回位置 -1。string(FIND)
子命令将所有字符串视为仅包含 ASCII 字符。存储在<output_variable>
中的索引也将以字节为单位计数,因此包含多字节字符的字符串可能会导致意外结果。
- string(REPLACE <match_string> <replace_string> <output_variable> <input> [<input>...])¶
将
<input>
中所有出现的<match_string>
替换为<replace_string>
,并将结果存储在<output_variable>
中。
使用正则表达式进行搜索和替换¶
- string(REGEX MATCH <regular_expression> <output_variable> <input> [<input>...])¶
匹配
<regular_expression>
一次并将匹配结果存储在<output_variable>
中。在匹配之前,将连接所有<input>
参数。正则表达式在下面的子部分中指定。
- string(REGEX MATCHALL <regular_expression> <output_variable> <input> [<input>...])¶
尽可能多次匹配
<regular_expression>
,并将匹配结果作为列表存储在<output_variable>
中。在匹配之前,将连接所有<input>
参数。
- string(REGEX REPLACE <regular_expression> <replacement_expression> <output_variable> <input> [<input>...])¶
尽可能多次匹配
<regular_expression>
,并在输出中将<replacement_expression>
替换为匹配项。<replacement_expression>
可以使用\1
、\2
……\9
来引用由括号分隔的匹配子表达式。请注意,在 CMake 代码中需要两个反斜杠 (\\1
) 才能通过参数解析获得一个反斜杠。
正则表达式规范¶
以下字符在正则表达式中具有特殊含义
^
匹配输入的开头
$
匹配输入的结尾
.
匹配任何单个字符
\<char>
匹配由
<char>
指定的单个字符。使用它来匹配特殊的正则表达式字符,例如\.
用于字面上的.
或\\
用于字面上的反斜杠\
。转义非特殊字符是不必要的,但允许,例如\a
匹配a
。[ ]
匹配括号内的任何字符。要匹配字面上的
]
,请将其作为第一个字符,例如[]ab]
。[^ ]
匹配括号内没有的任何字符。要避免匹配字面上的
]
,请将其作为第一个字符,例如[^]ab]
。-
在括号内,指定两侧字符之间的包含范围,例如
[a-f]
等价于[abcdef]
。要使用括号匹配字面上的-
,请将其作为第一个或最后一个字符,例如[+*/-]
匹配基本数学运算符。*
匹配前面的模式零次或多次
+
匹配前面的模式一次或多次
?
仅匹配前面的模式零次或一次
|
匹配
|
两侧的模式()
保存匹配的子表达式,可以在
REGEX REPLACE
操作中引用。版本 3.9 中新增: 所有与正则表达式相关的命令,包括例如
if(MATCHES)
,将子组匹配保存到变量CMAKE_MATCH_<n>
中,其中<n>
为 0..9。
*
、+
和 ?
的优先级高于连接。 |
的优先级低于连接。这意味着正则表达式 ^ab+d$
匹配 abbd
但不匹配 ababd
,而正则表达式 ^(ab|cd)$
匹配 ab
但不匹配 abd
。
CMake 语言 转义序列(如 \t
、\r
、\n
和 \\
)可用于构建字面量制表符、回车符、换行符和反斜杠(分别)。例如
带引号的参数
"[ \t\r\n]"
指定一个匹配任何单个空白字符的正则表达式。带引号的参数
"[/\\]"
指定一个匹配单个正斜杠/
或反斜杠\
的正则表达式。带引号的参数
"[A-Za-z0-9_]"
指定一个匹配 C 语言区域设置中任何单个“单词”字符的正则表达式。带引号的参数
"\\(\\a\\+b\\)"
指定一个匹配精确字符串(a+b)
的正则表达式。每个\\
在带引号的参数中被解析为\
,因此正则表达式本身实际上是\(\a\+\b\)
。这也可以在 括号参数 中指定,而无需转义反斜杠,例如[[\(\a\+\b\)]]
。
操作¶
- string(APPEND <string_variable> [<input>...])¶
版本 3.4 中新增。
将所有
<input>
参数追加到字符串中。
- string(PREPEND <string_variable> [<input>...])¶
自版本 3.10 起添加。
将所有
<input>
参数添加到字符串的前面。
- string(CONCAT <output_variable> [<input>...])¶
连接所有
<input>
参数,并将结果存储到名为<output_variable>
的变量中。
- string(JOIN <glue> <output_variable> [<input>...])¶
自版本 3.12 起添加。
使用
<glue>
字符串连接所有<input>
参数,并将结果存储到名为<output_variable>
的变量中。要连接列表的元素,建议使用
list()
命令中的JOIN
操作符。这样可以允许元素包含;
等特殊字符。
- string(TOLOWER <string> <output_variable>)¶
将
<string>
转换为小写字符。
- string(TOUPPER <string> <output_variable>)¶
将
<string>
转换为大写字符。
- string(LENGTH <string> <output_variable>)¶
将给定字符串的字节长度存储到
<output_variable>
中。请注意,这意味着如果<string>
包含多字节字符,则存储在<output_variable>
中的结果**不是**字符数。
- string(SUBSTRING <string> <begin> <length> <output_variable>)¶
将给定
<string>
的子字符串存储到<output_variable>
中。如果<length>
为-1
,则将从<begin>
开始的字符串其余部分返回。自版本 3.2 起更改: 如果
<string>
短于<length>
,则使用字符串的末尾。以前的 CMake 版本在此情况下会报告错误。<begin>
和<length>
都是以字节为单位计算的,因此如果<string>
可能包含多字节字符,则必须小心使用。
- string(STRIP <string> <output_variable>)¶
将给定
<string>
的子字符串(已去除开头和结尾的空格)存储到<output_variable>
中。
- string(GENEX_STRIP <string> <output_variable>)¶
自版本 3.1 起添加。
从输入
<string>
中去除任何生成器表达式
,并将结果存储到<output_variable>
中。
- string(REPEAT <string> <count> <output_variable>)¶
自版本 3.15 起添加。
将输出字符串作为输入
<string>
重复<count>
次。
比较¶
- 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>
中。自版本 3.7 起添加: 添加了
LESS_EQUAL
和GREATER_EQUAL
选项。
哈希¶
- string(<HASH> <output_variable> <input>)¶
计算
<input>
字符串的加密哈希值。支持的<HASH>
算法名称为MD5
消息摘要算法 5,RFC 1321。
SHA1
美国安全哈希算法 1,RFC 3174。
SHA224
美国安全哈希算法,RFC 4634。
SHA256
美国安全哈希算法,RFC 4634。
SHA384
美国安全哈希算法,RFC 4634。
SHA512
美国安全哈希算法,RFC 4634。
SHA3_224
Keccak SHA-3。
SHA3_256
Keccak SHA-3。
SHA3_384
Keccak SHA-3。
SHA3_512
Keccak SHA-3。
版本 3.8 中新增: 添加了
SHA3_*
哈希算法。
生成¶
- string(ASCII <number> [<number> ...] <output_variable>)¶
将所有数字转换为相应的 ASCII 字符。
- string(HEX <string> <output_variable>)¶
版本 3.18 中新增。
将输入
<string>
中的每个字节转换为其十六进制表示形式,并将连接的十六进制数字存储在<output_variable>
中。输出中的字母(a
到f
)为小写。
- string(CONFIGURE <string> <output_variable> [@ONLY] [ESCAPE_QUOTES])¶
转换
<string>
,就像configure_file()
转换文件一样。
- string(MAKE_C_IDENTIFIER <string> <output_variable>)¶
将输入
<string>
中的每个非字母数字字符转换为下划线,并将结果存储在<output_variable>
中。如果<string>
的第一个字符是数字,则还会在结果前面加上下划线。
- string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output_variable>)¶
返回一个给定
<length>
的随机字符串,该字符串由给定<alphabet>
中的字符组成。默认长度为 5 个字符,默认字母表为所有数字以及大小写字母。如果给定整数RANDOM_SEED
,则其值将用于播种随机数生成器。
- string(TIMESTAMP <output_variable> [<format_string>] [UTC])¶
将当前日期和/或时间的字符串表示形式写入
<output_variable>
。如果命令无法获取时间戳,则
<output_variable>
将设置为空字符串""
。可选的
UTC
标志请求当前日期/时间表示形式为协调世界时 (UTC),而不是本地时间。可选的
<format_string>
可以包含以下格式说明符%%
版本 3.8 中新增。
文字百分号 (%)。
%d
当前月份的天数 (01-31)。
%H
24 小时制的小时数 (00-23)。
%I
12 小时制的小时数 (01-12)。
%j
当前年份的天数 (001-366)。
%m
当前年份的月份 (01-12)。
%b
版本 3.7 中新增。
缩写月份名称(例如 Oct)。
%B
自版本 3.10 起添加。
完整月份名称(例如 October)。
%M
当前小时的分钟数 (00-59)。
%s
版本 3.6 中新增。
自 1970 年 1 月 1 日午夜 (UTC) 以来的秒数(UNIX 时间)。
%S
当前分钟的秒数。60 表示闰秒。(00-60)
%f
版本 3.23 中新增。
当前秒的微秒数 (000000-999999)。
%U
当前年份的周数 (00-53)。
%V
版本 3.22 中新增。
当前年份的 ISO 8601 周数 (01-53)。
%w
当前一周的天数。0 是星期日。(0-6)
%a
版本 3.7 中新增。
缩写工作日名称(例如 Fri)。
%A
自版本 3.10 起添加。
完整工作日名称(例如 Friday)。
%y
当前年份的后两位数字 (00-99)。
%Y
当前年份。
%z
版本 3.26 中新增。
时区相对于 UTC 的偏移量,以小时和分钟表示,格式为
+hhmm
或-hhmm
。%Z
版本 3.26 中新增。
时区名称。
未知的格式说明符将被忽略并按原样复制到输出中。
如果没有给出显式的
<format_string>
,则默认为%Y-%m-%dT%H:%M:%S for local time. %Y-%m-%dT%H:%M:%SZ for UTC.
版本 3.8 中新增: 如果设置了
SOURCE_DATE_EPOCH
环境变量,则将使用其值而不是当前时间。有关详细信息,请参阅https://reproducible-builds.org/specs/source-date-epoch/。
- string(UUID <output_variable> NAMESPACE <namespace> NAME <name> TYPE <MD5|SHA1> [UPPER])¶
自版本 3.1 起添加。
根据
<namespace>
(它本身必须是有效的 UUID)和<name>
的组合值的哈希值,创建符合 RFC4122 的通用唯一标识符(也称为 GUID)。哈希算法可以是MD5
(版本 3 UUID)或SHA1
(版本 5 UUID)。UUID 的格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
,其中每个x
代表一个小写十六进制字符。在需要的地方,可以使用可选的UPPER
标志请求大写表示形式。
JSON¶
版本 3.19 中新增。
查询 JSON 字符串的功能。
注意
在以下每个与 JSON 相关的子命令中,如果给出了可选的ERROR_VARIABLE
参数,则错误将报告在<error-variable>
中,并且<out-var>
将设置为<member|index>-[<member|index>...]-NOTFOUND
,其中包含导致错误的路径元素,或者如果不存在相关路径,则只设置为NOTFOUND
。如果发生错误但不存在ERROR_VARIABLE
选项,则会生成致命错误消息。如果未发生错误,则<error-variable>
将设置为NOTFOUND
。
- string(JSON <out-var> [ERROR_VARIABLE <error-variable>] GET <json-string> <member|index> [<member|index> ...])¶
从
<json-string>
中获取由<member|index>
参数列表指定的路径处的元素。数组和对象元素将以 JSON 字符串的形式返回。布尔元素将返回ON
或OFF
。空元素将返回空字符串。数字和字符串类型将返回字符串。
- string(JSON <out-var> [ERROR_VARIABLE <error-variable>] TYPE <json-string> <member|index> [<member|index> ...])¶
获取
<json-string>
中由<member|index>
参数列表指定的路径处的元素的类型。<out-var>
将设置为以下值之一:NULL
、NUMBER
、STRING
、BOOLEAN
、ARRAY
或OBJECT
。
- string(JSON <out-var> [ERROR_VARIABLE <error-var>] MEMBER <json-string> [<member|index> ...] <index>)¶
获取
<json-string>
中由<member|index>
参数列表指定的路径处的第<index>
个成员的名称。需要一个对象类型的元素。
- string(JSON <out-var> [ERROR_VARIABLE <error-variable>] LENGTH <json-string> [<member|index> ...])¶
获取
<json-string>
中由<member|index>
参数列表指定的路径处的元素的长度。需要一个数组或对象类型的元素。
- string(JSON <out-var> [ERROR_VARIABLE <error-variable>] REMOVE <json-string> <member|index> [<member|index> ...])¶
从
<json-string>
中移除由<member|index>
参数列表指定的路径处的元素。移除元素后的 JSON 字符串将存储在<out-var>
中。
- string(JSON <out-var> [ERROR_VARIABLE <error-variable>] SET <json-string> <member|index> [<member|index> ...] <value>)¶
将
<json-string>
中由<member|index>
参数列表指定的路径处的元素设置为<value>
。<value>
的内容应为有效的 JSON。如果<json-string>
是一个数组,则可以使用大于或等于数组长度的数字作为<member|index>
参数,将<value>
追加到数组的末尾。
- string(JSON <out-var> [ERROR_VARIABLE <error-var>] EQUAL <json-string1> <json-string2>)¶
比较由
<json-string1>
和<json-string2>
给出的两个 JSON 对象是否相等。<json-string1>
和<json-string2>
的内容应为有效的 JSON。如果 JSON 对象被认为相等,则<out-var>
将设置为真值,否则设置为假值。