字串

字串操作。

概要

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>。所有 <input> 引數在比對前會先串連。

<replacement_expression> 可以使用 \1\2、...、\9 引用比對中以括號分隔的子表示式。請注意,在 CMake 程式碼中需要兩個反斜線 (\\1) 才能透過引數解析取得反斜線。

正規表示式規範

下列字元在正規表示式中具有特殊意義

^

^

$

在輸入的開頭比對

.

$

在輸入的結尾比對

.

[ ]

比對任何單一字元

[^ ]

\<char>

-

比對 <char> 指定的單一字元。使用此方法來比對特殊正規表示式字元,例如 \. 代表字面上的 .\\ 代表字面上的反斜線 \。跳脫非特殊字元是不必要的,但允許,例如 \a 比對 a

*

[...]

+

比對括號內部的任何字元。若要比對字面上的 ],請將其設為第一個字元,例如 []ab]

?

[^...]

|

比對括號外部的任何字元。若不要比對字面上的 ],請將其設為第一個字元,例如 [^]ab]

()

[x-y]

在括號內,指定兩側字元之間的包含範圍,例如 [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\\,可用於建構字面上的 Tab 字元、歸位字元、換行字元和反斜線 (分別),以傳遞至正規表示式。例如

引號引起來的引數 "[ \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>)

<output_variable> 中儲存給定 <string> 的子字串。如果 <length>-1,則將傳回從 <begin> 開始的字串剩餘部分。

在版本 3.2 中變更:如果 <string><length> 短,則會改為使用字串的結尾。在舊版的 CMake 中,此情況會報告錯誤。
<begin><length> 都以位元組計數,因此如果 <string> 可能包含多位元組字元,則必須謹慎。
string(STRIP <string> <output_variable>)
<output_variable> 中儲存給定 <string> 的子字串,並移除開頭和結尾的空格。
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>)

比較字串,並在 <output_variable> 中儲存 true 或 false。

string(COMPARE GREATER_EQUAL <string1> <string2> <output_variable>)

在版本 3.7 中新增:新增了 LESS_EQUALGREATER_EQUAL 選項。

string(COMPARE GREATER_EQUAL <string1> <string2> <output_variable>)

雜湊

string(COMPARE GREATER_EQUAL <string1> <string2> <output_variable>)

string(<HASH> <output_variable> <input>)

計算 <input> 字串的加密雜湊。支援的 <HASH> 演算法名稱為

MD5

計算 <input> 字串的加密雜湊。支援的 <HASH> 演算法名稱為

訊息摘要演算法 5,RFC 1321。

計算 <input> 字串的加密雜湊。支援的 <HASH> 演算法名稱為

SHA1

計算 <input> 字串的加密雜湊。支援的 <HASH> 演算法名稱為

美國安全雜湊演算法 1,RFC 3174。

SHA224

美國安全雜湊演算法,RFC 4634。

SHA256

SHA384

SHA512

SHA3_224

Keccak SHA-3。

SHA3_256

SHA3_384

SHA3_512

在版本 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)。

*+? 的優先順序高於串連。| 的優先順序低於串連。這表示正規表示式 ^ab+d$ 比對 abbd 而非 ababd,而正規表示式 ^(ab|cd)$ 比對 ab 而非 abd

%H

24 小時制的小時 (00-23)。

%I

12 小時制的小時 (01-12)。

%j

目前年份的日期 (001-366)。

%m

目前年份的月份 (01-12)。

%b

在版本 3.7 中新增。

縮寫月份名稱 (例如 Oct)。

%B

完整月份名稱 (例如 October)。

%M

目前小時的分鐘 (00-59)。

%s

在版本 3.6 中新增。

自 1970 年 1 月 1 日午夜 (UTC) 以來的秒數 (UNIX 時間)。

%S

字面上的百分比符號 (%)。

目前分鐘的秒數。60 代表閏秒。(00-60)

%f

*+? 的優先順序高於串連。| 的優先順序低於串連。這表示正規表示式 ^ab+d$ 比對 abbd 而非 ababd,而正規表示式 ^(ab|cd)$ 比對 ab 而非 abd

在版本 3.23 中新增。

目前秒數的微秒 (000000-999999)。

目前年份的後兩位數字 (00-99)。

%Y

目前年份。

%z

在 3.26 版本中新增。

UTC 時區的偏移量,以小時和分鐘表示,格式為 +hhmm-hhmm

%Z

在 3.26 版本中新增。

時區名稱。

未知的格式指定符將被忽略並按原樣複製到輸出中。

如果未給出明確的 <format_string>,則預設為

  • %Y-%m-%dT%H:%M:%S 用於本地時間。

  • %Y-%m-%dT%H:%M:%SZ 用於 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])

string(TOUPPER <string> <output_variable>)

根據 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 字串形式傳回。布林元素將以 ONOFF 形式傳回。Null 元素將以空字串形式傳回。數字和字串類型將以字串形式傳回。

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。<out-var> 將在 JSON 物件被視為相等時設定為真值,否則設定為假值。