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>) string(REGEX QUOTE <out-var> <input>...) 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>替换匹配项,输出结果。所有<input>参数在匹配之前会被连接起来。<replacement_expression>可以使用\1,\2, ...,\9来引用匹配项中用括号括起来的子表达式。请注意,在 CMake 代码中需要使用两个反斜杠 (\\1) 才能将一个反斜杠传递给参数解析。
版本 4.1 中已更改: ^ 锚点现在仅匹配输入字符串的开头,而不是每个重复搜索的开头。请参阅策略 CMP0186。
在 MATCHALL 和 REPLACE 中允许零长度匹配。以前,这会触发错误。
替换表达式可能包含对未匹配任何内容的子表达式的引用。以前,此类引用会触发错误。
正则表达式规范¶
以下字符在正则表达式中具有特殊含义
^匹配输入开头
$匹配输入结尾
.匹配任何单个字符
\<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 locale 中任何单个“单词”字符的正则表达式。引用的参数
"\\(\\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>包含多字节字符,结果将 *不* 是字符数。
- string(SUBSTRING <string> <begin> <length> <output_variable>)¶
将给定
<string>的子字符串存储在<output_variable>中。如果<length>为-1,则将返回从<begin>开始的剩余字符串。版本 3.2 中已更改: 如果
<string>比<length>短,则使用字符串的结尾。先前的 CMake 版本在这种情况下会报告错误。字节数,因此如果
<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(REGEX QUOTE <out-var> <input>...)¶
版本 4.2 中添加。
将匹配
<input>的正则表达式存储在<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>中。版本 3.7 中已添加: 添加了
LESS_EQUAL和GREATER_EQUAL选项。
哈希¶
- string(<HASH> <output_variable> <input>)¶
计算
<input>字符串的加密哈希。支持的<HASH>算法名称是MD5Message-Digest Algorithm 5, RFC 1321。
SHA1US Secure Hash Algorithm 1, RFC 3174。
SHA224US Secure Hash Algorithms, RFC 4634。
SHA256US Secure Hash Algorithms, RFC 4634。
SHA384US Secure Hash Algorithms, RFC 4634。
SHA512US Secure Hash Algorithms, RFC 4634。
SHA3_224Keccak SHA-3。
SHA3_256Keccak SHA-3。
SHA3_384Keccak SHA-3。
SHA3_512Keccak 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])¶
像
configure_file()转换文件一样转换<string>。
- 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)。
%H24 小时制的小时 (00-23)。
%I12 小时制的小时 (01-12)。
%j当前年份的日期 (001-366)。
%m当前年份的月份 (01-12)。
%b3.7 版本中新增。
缩写的月份名称(例如,Oct)。
%B3.10 版本新增。
完整的月份名称(例如,October)。
%M当前小时的分钟 (00-59)。
%s3.6 版本新增。
自午夜 (UTC) 1970 年 1 月 1 日以来的秒数(UNIX 时间)。
%S当前分钟的秒数。60 代表闰秒。(00-60)
%f在版本 3.23 中添加。
当前秒的微秒 (000000-999999)。
%U当前年份的周数 (00-53)。
%V3.22 版本新增。
当前年份的 ISO 8601 周数 (01-53)。
%w当前周的星期。0 是星期日。(0-6)
%a3.7 版本中新增。
缩写的星期名称(例如,Fri)。
%A3.10 版本新增。
完整的星期名称(例如,Friday)。
%y当前年份的后两位数字 (00-99)。
%Y当前年份。
%z3.26 版新增。
时区与 UTC 的偏移量,以小时和分钟表示,格式为
+hhmm或-hhmm。%Z3.26 版新增。
时区名称。
未知的格式说明符将被忽略并按原样复制到输出。
如果未给出显式
<format_string>,则默认值为本地时间的
%Y-%m-%dT%H:%M:%S。UTC 的
%Y-%m-%dT%H:%M:%SZ。
版本 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 中新增。
根据 RFC4122,通过对
<namespace>(本身必须是一个有效的 UUID)和<name>的组合值进行哈希,创建一个通用唯一标识符(也称为 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。
在下面的子命令中,<json-string> 参数应写成 引用的参数,以确保整个 JSON 字符串被传递为单个参数,即使它包含分号。
- string(JSON <out-var> [ERROR_VARIABLE <error-variable>] GET <json-string> <member|index> [<member|index> ...])¶
从
<json-string>中获取位于由<member|index>参数列表指定的位置的元素。数组和对象元素将作为 JSON 字符串返回。布尔值元素将返回ON或OFF。Null 元素将返回空字符串。数字和字符串类型将作为字符串返回。
- 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-var>] 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>将被设置为一个真值,否则设置为一个假值。