CMake:在正则表达式中转义变量内的符号

时间:2012-11-26 17:07:58

标签: regex cmake

我尝试在CMake中识别带有正则表达式的flexc ++程序版本。

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\\+\\+

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您可以使用string(REPLACE...)转义“++”:

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