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 <字串> <子字串> <輸出變數> [REVERSE])

傳回在提供的 <字串> 中找到給定的 <子字串> 的位置。如果使用了 REVERSE 旗標,則命令將搜尋指定 <子字串> 最後一次出現的位置。如果找不到 <子字串>,則傳回 -1 的位置。

string(FIND) 子命令將所有字串視為僅限 ASCII 的字元。儲存在 <輸出變數> 中的索引也會以位元組計算,因此包含多位元組字元的字串可能會導致非預期的結果。

string(REPLACE <符合字串> <取代字串> <輸出變數> <輸入> [<輸入>...])

<輸入> 中所有出現的 <符合字串> 取代為 <取代字串>,並將結果儲存在 <輸出變數> 中。

使用正規表示式搜尋與取代

string(REGEX MATCH <正規表示式> <輸出變數> <輸入> [<輸入>...])

比對 <正規表示式> 一次,並將比對結果儲存在 <輸出變數> 中。所有 <輸入> 引數會在比對之前串連起來。正規表示式在下方的子章節中指定。

string(REGEX MATCHALL <正規表示式> <輸出變數> <輸入> [<輸入>...])

比對 <正規表示式> 盡可能多次,並將比對結果以清單形式儲存在 <輸出變數> 中。所有 <輸入> 引數會在比對之前串連起來。

string(REGEX REPLACE <正規表示式> <取代表示式> <輸出變數> <輸入> [<輸入>...])

比對 <正規表示式> 盡可能多次,並以輸出中的比對結果取代 <取代表示式>。所有 <輸入> 引數會在比對之前串連起來。

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

正規表示式規格

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

^

在輸入開頭比對

$

在輸入結尾比對

.

比對任何單一字元

\<字元>

比對由 <字元> 指定的單一字元。使用此選項來比對特殊的正規表示式字元,例如,\. 代表常值 .\\ 代表常值反斜線 \。逸出非特殊字元是不必要的,但允許這樣做,例如,\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])

轉換一個像 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>)

傳回一個由給定的 <alphabet> 中的字元組成的指定 <length> 長度的隨機字串。預設長度為 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> 將會被設定為 true 值,否則設定為 false 值。