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_EQUALGREATER_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>中。输出中的字母(af)为小写。

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 字符串的形式返回。布尔元素将返回 ONOFF。空元素将返回空字符串。数字和字符串类型将返回字符串。

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

获取 <json-string> 中由 <member|index> 参数列表指定的路径处的元素的类型。 <out-var> 将设置为以下值之一:NULLNUMBERSTRINGBOOLEANARRAYOBJECT

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> 将设置为真值,否则设置为假值。