CMake常用指令-string

看CMake构建实战的笔记

  • 当前部分是CMake中关于常用指令中的string的部分
  • 主要包括有 字符串比较,搜索,替换
  • 下面的部分都是在本地执行验证过的
  • string.cmake
  • 使用cmake -P string.cmake 指令编译
scss 复制代码
message("--常用命令-string--")
message("--1.搜索和替换--")
message("--搜索字符串--")
# string(FIND <字符串> <子字符串> <结果变量> [REVERSE])
#在字符串中搜索子字符串,并将其第一次出现的位置存放到结构变量中
# 当可选变量[REVERSE]指定时,变量结果里面就是保存子字符串最后一次出现的位置
# 如果子字符串不存在返回-1
string(FIND aba a res)
message("${res}") # 输出:0
string(FIND aba a res REVERSE)
message("${res}") # 输出:2
string(FIND aba c res)
message("${res}") # 输出:-1
message("--替换字符串--")
# string(REPLACE <匹配字符串> <替换字符串> 
# 	       <结果变量> 
# 	       <输入字符串> [<输入字符串>...])
# 该命令会将若干<输入字符串>连接在一起,将其中出现的所有<匹配字符串> 替换为<替换字符串>,并将最终结果存入<结果变量>
# 将时将一个或多个输入字符串 中的匹配字符串替换称为替换字符串 并将所有输入字符串拼接到一起给结果变量
string(REPLACE a b res aba)
message("${res}") # 输出:bbb
string(REPLACE a b res abc cab)
message("${res}") # 输出:bbccbb
message("--2.正侧匹配和替换--")
message("--正则表达式语法--")
# ^ 匹配输入的起始点
# $ 匹配输入的终止点
# ^和&的组合 将匹配范围锁定为整个字符串
# .匹配任意单个字符
# <字符> 匹配指定<字符> 一般用于转义正则中的特殊字符,
# [] 匹配方括号中的任意某个字符
# [^] 匹配任意某个不在方括号中的字符
# - 在方括号中表示字符区间
# * 匹配其前面的模式零次或多次 /ab*c/ ac之间的b存不存在都可以
# + 匹配其键名的模式一次或多次
# ? 匹配其前面的模式零次或一次
# | 匹配其两侧的模式之一
# () 用于声明一个子表达式 可以在字符串的正侧替换命令中引用

#定义一个匹配空白符的正则表达式
set(regex "[ \t\n\r]")
message("--单次正则表达式--")
# 单次正则表达式
# string(REGEX MATCH <正则表达式> 
# 	       <结果变量> 
# 	       <输入字符串> [<输入字符串>...])
# 将一个或多个输入字符串链接在一起 在其中匹配<正则表达式>一次 并将最终的匹配结构存入<结果变量> 
set(regex "[abc]+") #[abc]+ 就相当于将要匹配的字符串中所有的abc全部匹配出来
string(REGEX MATCH ${regex} res aaa)
message("${res}") # 输出:aaa
string(REGEX MATCH ${regex} res aaa bbb ccc abc)
message("${res}") # 输出:aaabbbcccabc
string(REGEX MATCH ${regex} res aaad)
message("${res}") # 输出:aaa
string(REGEX MATCH ${regex} res bcd aaa)
message("${res}") # 输出:bc
set(regex ^[abc]+$) # 字符串从头到尾只能由 a、b、c 中的任意一个或多个字符组成
string(REGEX MATCH ${regex} res aaa)
message("${res}") # 输出:aaa
string(REGEX MATCH ${regex} res aaa bbb ccc abc)
message("${res}") # 输出:aaabbbcccabc
string(REGEX MATCH ${regex} res aaad)
message("${res}") # 输出空
string(REGEX MATCH ${regex} res bcd aaa)
message("${res}") # 输出空
message("--全部正则表达式--")
# string(REGEX MATCHALL <正则表达式> 
        # <结果变量> 
        # <输入字符串> [<输入字符串>...])
# 该命令会将若干<输入字符串>连接在一起,在其中匹配指定的<正则表达式> 尽可能多的次数(即全部匹配),并将最终匹配结果以列表的形式存入<结果变量>
# 和上面的单次的主要的区别是在单次是不管你输入多少 最后都只会输出一个
# 全部的化 会将匹配的都输出成为一个列表
set(regex "([abc]+)")
	string(REGEX MATCHALL ${regex} res adb dcd abcdcba dd cc)
	message("${res}") # 输出:a;b;c;abc;cba
message("--正则替换--")
# string(REGEX REPLACE <正则表达式>
# 	       <替换表达式> <结果变量> 
# 	       <输入字符串> [<输入字符串>...])
# 该命令会将若干<输入字符串>连接在一起,在其中匹配指定的<正则表达式> 尽可能多的次数,并将匹配的部分根据<替换表达式>进行替换,保存结果至<结果变量> 中
# 将a、b、c组成的部分替换为-
string(REGEX REPLACE "[abc]+" "-" res adabc dccc)
message("${res}") # 输出:-d-d-
# 将由a、b、c组成的部分用括号括起
string(REGEX REPLACE "[abc]+" "(\0)" res adabc dccc)
message("${res}") # 输出:(a)d(abc)d(ccc)
# 将长度至少为2的由a、b、c组成的部分的第1个字母用括号括起
string(REGEX REPLACE "([abc])([abc]+)" [[(\1)\2]] res adabcdccc)
message("${res}") # 输出:ad(a)bcd(c)cc
message("--捕获组变量--")
# 捕获组(capture group)即正则表达式中子表达式匹配的结果。
# 捕获组可以在正则替换的替换表达式中通过反斜杠语法来访问
# CMAKE_MATCH_COUNT,其值为捕获组的数量
# CMAKE_MATCH_<n>,其值为第n个捕获组的匹配内容。当n为0时,其值为正则匹配的完整结果而非子表达式匹配的结果。
function(print_matches)
    message("CMAKE_MATCH_COUNT: ${CMAKE_MATCH_COUNT}")
    message("CMAKE_MATCH_0: ${CMAKE_MATCH_0}")
    message("CMAKE_MATCH_1: ${CMAKE_MATCH_1}")
    message("CMAKE_MATCH_2: ${CMAKE_MATCH_2}")
    message("---")
endfunction()
set(regex "([abc])([abc]+)")
# 单次正则匹配
string(REGEX MATCH ${regex} res aaa d abc)
print_matches()
# 全部正则匹配
string(REGEX MATCHALL ${regex} res aaa d abc)
print_matches()
# 正则替换
string(REGEX REPLACE ${regex} [[(\1)\2]] res aaa d abc)
print_matches()
message("--3.取字符串长度--")
# string(LENGTH <输入字符串> <结果变量>)
string(LENGTH "123asd" res)
message("string length:${res}")
message("--4.字符串变换--")
# 追加字符串
# string(APPEND <字符串变量> [<输入字符串>...])
# 该命令将全部<输入字符串>依次追加到<字符串变量>末尾。
# 前插字符串
# string(PREPEND <字符串变量> [<输入字符串>...])
# 该命令会将<输入字符串>连接为一个整体,直接插入到<字符串变量>开头。
# 连接字符串
# string(CONCAT <结果变量> [<输入字符串>...])
# 该命令将全部<输入字符串>连接在一起,并存入<结果变量>中。代码清单4.8中是一些实例。
set(res "原值")
string(CONCAT res a b c)
message("${res}") # 输出:abc
# 分隔符连接
# string(JOIN <分隔符> <结果变量> [<输入字符串>...])
# 该命令将全部<输入字符串>以指定的<分隔符>分隔并连接在一起,并存入<结果变量>。代码清单4.9中是一些分隔符连接实例。
string(JOIN "-" res 2021 02 21)
message("${res}") # 输出:2021-02-21
string(JOIN "->" res A B C)
message("${res}") # 输出:A->B->C
# 大小写转换
# string(TOLOWER <输入字符串> <结果变量>) # 转小写
# string(TOUPPER <输入字符串> <结果变量>) # 转大写
# 这两个命令分别将<输入字符串>中的字符转换为小写和大写形式。
# 重复字符串
# string(REPEAT <输入字符串> <重复次数> <结果变量>)
# 该命令将<输入字符串>重复指定的<重复次数>,并将结果存入<结果变量>。
# 取子字符串
# string(SUBSTRING <输入字符串> <起始位置> <截取长度> <结果变量>)
# 该命令将<输入字符串>从<起始位置>开始截取指定的<截取长度>,并将其存入<结果变量>。
message("--5.比较字符串--")
# string(COMPARE LESS <字符串1> <字符串2> <结果变量>) # 小于
# string(COMPARE GREATER <字符串1> <字符串2> <结果变量>) # 大于
# string(COMPARE EQUAL <字符串1> <字符串2> <结果变量>) # 等于
# string(COMPARE NOTEQUAL <字符串1> <字符串2> <结果变量>) # 不等于
# string(COMPARE LESS_EQUAL <字符串1> <字符串2> <结果变量>) # 小于或等于
# string(COMPARE GREATER_EQUAL <字符串1> <字符串2> <结果变量>) # 大于或等于
string(COMPARE LESS a abc res)
message("${res}") # 输出:1
string(COMPARE GREATER a abc res)
message("${res}") # 输出:0
message("--6.取哈希值--")
# string(<哈希算法> <结果变量> <输入字符串>)
message("--7. 字符串生成--")
message("--8. 字符串模板--")
message("--9. JSON操作--")

本文使用 markdown.com.cn 排版

相关推荐
Shadow(⊙o⊙)16 天前
CMake实现客户端、服务端交流
组件·cmake
繁重的秋春19 天前
Qt6.0下的CMake的部署配置
qt·cmake
Lee_jerome25 天前
《C/C++编译全家桶:g++四阶段、.a与.so区别、CMake构建、ARM交叉编译,这篇全讲透了》
c语言·开发语言·arm开发·c++·编译·cmake·cmakelists
开发者联盟league1 个月前
cmake 创建和使用静态库(极简版)
c++·cmake·cpp
开发者联盟league1 个月前
CMake 实战:创建并使用静态库(MinGW + clangd)
cmake·cpp
Javenwww1 个月前
CMake入门——基本语法规则
cmake
郝学胜-神的一滴1 个月前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
橙色阳光五月天1 个月前
CMake 构建配置文件解析
c++·cmake·plugin
blueman88881 个月前
Qt5通过vcpkg中调用时,在debug模式下调试时总是调用release的plugins文件夹中的dll
c++·qt·cmake