1

CMakeの正規表現でflexc++プログラムのバージョンを認識しようとしています。

flexc++ バージョンの出力は次のようになります。

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

正規表現でバージョンを抽出しようとしています。実行可能ファイルの名前は変数にあります (この変数は他のコマンドの出力です)。問題は、flexc++ 名の文字列「++」です。この文字列は、記号「+」と競合します (1 つ以上の一致)。ミニテスト:

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

?

どうすればこの問題を解決できますか?

4

1 に答える 1

4

次を使用して「++」をエスケープできますstring(REPLACE...)

string(REPLACE "++" "\\+\\+" flexname_escaped ${flexname})
string(REGEX REPLACE "^${flexname_escaped} V([0-9.]+)$" "\\1"
       output "${sample}")
于 2012-11-26T19:38:33.887 に答える