正则找匹配字符

参考文档: https://juejin.cn/s/cmake%20string%20regex%20match%20group

CMake 支持正则表达式匹配,可以使用 string(REGEX MATCH ...) 命令来匹配字符串中的某一模式。如果匹配成功,可以使用捕获组(capture group)来提取匹配的子串。

语法:

string(REGEX MATCH <regular expression> <output variable> <input> [<input> ...])

示例:

set(string "hello world")
string(REGEX MATCH "(hello) ([a-z]+)" match_result ${string})
message("Match result: ${match_result}")
# Match result: hello world

# Extract capture groups
set(greeting ${CMAKE_MATCH_1})
set(word ${CMAKE_MATCH_2})
message("Greeting: ${greeting}")
# Greeting: hello
message("Word: ${word}")
# Word: world

在上面的示例中,string(REGEX MATCH ...) 命令会在字符串 "hello world" 中匹配模式 "(hello) ([a-z]+)",并将匹配结果存储在变量 match_result 中。捕获组在结果中以数字索引形式存在,可以使用 CMAKE_MATCH_<index> 变量来访问。

使用示例

查找路径

cmake_minimum_required(VERSION 3.5)

project(event_demo)

set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_STANDARD 14)

message(STATUS ${PROJECT_SOURCE_DIR})
get_filename_component(AP_SRC_DIR "${PROJECT_SOURCE_DIR}" DIRECTORY)
get_filename_component(AP_SRC_DIR "${AP_SRC_DIR}" DIRECTORY)
message(STATUS ${AP_SRC_DIR})

string(REGEX MATCH "(.*)ap/" AP_SRC_DIR ${PROJECT_SOURCE_DIR})
message(STATUS ${AP_SRC_DIR})

输出: /data/Project/GitLab/LCPP/src/P/ap/

如果使用get_filename_component(AP_SRC_DIR "${PROJECT_SOURCE_DIR}" DIRECTORY) 需要调用多次。