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_EQUAL
和GREATER_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>
中。輸出中的字母(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>)¶
傳回一個由給定的
<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 字串的形式回傳。布林元素將會以ON
或OFF
的形式回傳。空值元素將會以空字串回傳。數字和字串類型將會以字串形式回傳。
- 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。如果 JSON 物件被認為相等,則<out-var>
將會被設定為 true 值,否則設定為 false 值。