目录
其他常用操作 (输出字符串字符数,转换大小写,去掉字符串头尾空格)
cmake可以看作一门编程语言,同其他编程语言一样.cmake也有字符串概念.
随着项目变得越来越复杂,cmake需要一种管理变量的方式来实现复杂逻辑.cmake提供了string()命令.
第一个参数指定的是功能.
# 字符串查找和替换
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>...)
# 操作字符串
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>)
# 字符串比较
string(COMPARE <op> <string1> <string2> <out-var>)
# 计算字符串的 hash 值
string(<HASH> <out-var> <input>)
# 生产字符串
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 — CMake 3.27.0-rc4 Documentation
字符串查找
string(FIND <inputstring> <substring> <outvar> [REVERSE])
在inputstring中查找substring,将查找到的索引存在outvar中,索引从0开始.
如果没有REVERSE选项,则保存第一个查找到的索引,否则保存最后一个查找到的索引.
如果没有找到则返回-1.
需要注意的是string(FIND)将所有的字符串都作为ASCII字符.outvar中存储的索引也会以字节为单位计算,因此包含多字节字符的字符串可能会导致意想不到的结果.
demo
string(FIND "sasdfgzxasdcv" "asd" strIndex0)
string(FIND "sasdfgzxasdcv" "asd" strIndex1 REVERSE)
message(STATUS "strIndex0 = ${strIndex0} \n strIndex1 = ${strIndex1}")
strIndex0是没有 REVERSE选项的所以找到第一个就保存第一个,strIndex1有REVERSE选项所以保存的是最后一个找到的.
替换字符串
string(REPLACE matchString replaceWith outVar input...)
将input中所匹配matchString的都用replaceWith替换,并将结果保存到outVal中.
如果有多个input,他们是直接连接在一起的没有任何分隔符.这时候就会有很多问题,所以通常建议只提供一个input字符串.
demo:
asd是查找字符串,qwe是要替换的字符串,最后的asd_zxc_asd_poi是配替换的 strIndex是结果.
所以用asd匹配asd_zxc_asd_poi字符串,如果有就用qwe替换,最后替换的结果就存在strIndex中.如果匹配不到会原封不动的打印出字符串.
string(REPLACE "asd" "qwe" strIndex "asd_zxc_asd_poi")
message(STATUS "strIndex = ${strIndex}")
string(REPLACE "111" "qwe" strIndex "asd_zxc_asd_poi")
message(STATUS "strIndex = ${strIndex}")
我们还可以使用string()命令的正则方式替换字符串.
string(REGEX MATCH regex outVar input...)
string(REGEX MATCHALL regex outVar input...)
string(REGEX REPLACE regex replaceWith outVar input...)
input字符串同样会在开始匹配正则表达式前进行串联.
MATCH只查找第一个匹配的字符串保存到outVar中.
MATCHALL会查找所有匹配的字符串,并保存到outVar中,如果匹配到多个,outVar将是一个列表.
REPLACE会将每一个匹配到的字符串用replaceWith替换后,将替换后完整的字符串放到outVar中.
demo
string(REGEX MATCH "[asd]" matchOne "asdfgasdfg")
string(REGEX MATCHALL "[asd]" matchAll "asdfgasdfg")
string(REGEX REPLACE "([sd])" "X\\1Y" replVar1 "asd" "fga" "sdfg")
string(REGEX REPLACE "([sd])" [[X\1Y]] replVar2 "asdfgasdfg")
message("matchOne = ${matchOne}\n"
"matchAll = ${matchAll}\n"
"replVar1 = ${replVar1}\n"
"replVar2 = ${replVar2}")
"[asd]"这个是正则表达式,第一行表示,只要匹配到asd任何一个字符就保存下来,是任意一个字符都可以,比如asd匹配asdfgasdfg时a被匹配到了,所以matchOne就是存到a.
第二行代码时匹配所有符合条件的,asd中任何一个字符匹配到就存入matchAll中,如果有多个就用列表表示,所以 matchAll时a;s;d;a;s;d用分号表示就是列表.
第三行时匹配到sd任何一个字符在匹配到的字符前插入X匹配到的字符后插入Y,这就是打印的字符,分析一下:
后面的三段字符串可以看成一段"asdfgasdfg"
首先匹配到的时s 所以第一步字符串是这样的aXsYdfgasdfg
然后又匹配到d,第二步字符串时这样的aXsYXdYfgasdfg
第三步再匹配s :aXsYXdYfgaXsYdfg
第四步再匹配d: aXsYXdYfgaXsYXdYfg
所以打印的就这这个结果.
第四行代码和第三行一样,区别就是第三行使用字符串作为正则表达式需要注意要使用转义字符比如"X\\1Y"中有两个\\其中一个就是用做转移字符的,而第四行就是[[X\1Y]](lua格式)u也可以[==[X\1Y]==]就用了一个\就不需要转义了.
截取字符串
string(SUBSTRING input index length outVar)
将input字符串从index处截取length长度存放到outVar中
如果length为-1的话,将从index到input结尾的字符串保存到outVar中.
demo
这个demo比较简单,需要注意的一点就是index是从0开始的.如果index=-1那outVar就是空的.如果length长度超过了字符串长度,输出最多也会是结尾.
当然不建议使用第三行代码,因为那是个错误的写法.
string(SUBSTRING "asdfghjkl" 2 5 outVar0)
string(SUBSTRING "asdfghjkl" 2 -1 outVar1)
string(SUBSTRING "asdfghjkl" -1 -1 outVar2)
string(SUBSTRING "asdfghjkl" 2 10 outVar3)
message("outVar0 = ${outVar0}\n"
"outVar1 = ${outVar1}\n"
"outVar2 = ${outVar2}\n"
"outVar3 = ${outVar3}\n")
其他常用操作 (输出字符串字符数,转换大小写,去掉字符串头尾空格)
string(LENGTH input outVar)
string(TOLOWER input outVar)
string(TOUPPER input outVar)
string(STRIP input outVar)
string(TIMESTAMP TimeStamp)
LENGTH获取input字符串长度,保存到outVar中.
TOLOWER将input字符串转换成小写保存到outVar中.
TOUPPER将input字符串转成大写保存到outVar中.
STRIP将input字符串的头尾空格去掉.(只去掉头尾不去掉中间的,去掉的空格不限个数就算前后有多个空格都会去掉)
TIMESTAMP 打印的是时间戳.string(TIMESTAMP <output_variable> [<format_string>] [UTC])
也可以使用其他格式的 format_string这个可选参数是选择其他参数的
demo
string(LENGTH " Asd Fgh " outVar0)
string(TOLOWER " Asd Fgh " outVar1)
string(TOUPPER " Asd Fgh " outVar2)
string(STRIP " Asd Fgh " outVar3)
string(TIMESTAMP TimeStamp)
message("outVar0 = ${outVar0}\n"
"outVar1 = ${outVar1}\n"
"outVar2 = ${outVar2}\n"
"outVar3 = ${outVar3}\n"
"TimeStamp = ${TimeStamp}")