字串¶
字串操作。
概要¶
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>
的變數中。
-
將
<string>
轉換為小寫字元。 string(TOUPPER <string> <output_variable>)¶
將
<string>
轉換為大寫字元。
在 <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_EQUAL
和GREATER_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>
中。輸出中的字母 (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)。
*
、+
和?
的優先順序高於串連。|
的優先順序低於串連。這表示正規表示式^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 字串形式傳回。布林元素將以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-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 物件被視為相等時設定為真值,否則設定為假值。