CMake的:一个变量中逸出的符号,在正则表达式(CMake: escaping symbols i

2019-10-17 10:38发布

我试图识别flexc ++程序的版本与CMake的正则表达式。

的flexc ++版本的输出中是这样的:

prompt$ flexc++ --version
flexc++ V1.01.00

我尝试用正则表达式来提取版本。 该可执行文件的名称是在一个变量(和这个变量是其它命令的输出)。 问题是在flexc ++名字符串“++”。 此字符串创建符号“+”(一个或多个配衬)冲突。 迷你测试:

set(sample "flexc++ V1.01.00")
set(flexname "flexc++")

string(REGEX REPLACE "^${flexname} V([0-9.]+)$" "\\1"
       output "${sample}")

message("${output}")

投掷下一个错误:

RegularExpression::compile(): Nested *?+.
RegularExpression::compile(): Error in compile.
CMake Error at prueba.cmake:4 (string):
  string sub-command REGEX, mode REPLACE failed to compile regex "^flexc++
  V([0-9.]+)$".

如果我删除样品和文件名变量“++”的字符串,它认识到完善的版本:

set(sample "flexc V1.01.00")
set(flexname "flexc")

string(REGEX REPLACE "^${flexname} V([0-9.]+)$" "\\1"
       output "${sample}")

message("${output}")

输出:

1.01.00

也就是说,问题是“++”的字符串。

我怎样才能避免这个问题? 例如,是否有在CMake的任何命令,如:

scape(flexname_scaped ${flexname})

执行

flexname_scaped <-- flexc\\+\\+

我怎么解决这个问题?

Answer 1:

你可以逃脱“++”使用string(REPLACE...)

string(REPLACE "++" "\\+\\+" flexname_escaped ${flexname})
string(REGEX REPLACE "^${flexname_escaped} V([0-9.]+)$" "\\1"
       output "${sample}")


文章来源: CMake: escaping symbols inside a variable, in regular expressions
标签: regex cmake