CMake: 正規表現

## はじめに

みなさん、こんにちは。今回は、CMake における正規表現について書いていきます。

## 使用できるメタ文字

CMake では、`string(REGEX MATCH)`コマンドや`ctest`コマンドの`-R`オプションなど、幾つかの文脈で正規表現ができます。この正規表現は、Ruby や Perl などのそれと比較すると低機能なものとなっており、たとえば英数字とアンダースコア`_`にマッチする`\w`や、数字にマッチする`\d`などは使用できません。また、繰り返しを表す`{n}`なども使用できません。使用できるメタ文字は以下となります。

* 先頭`^`
* 末尾`$`
* 任意の文字`.`
* ブラケット内に列挙された文字`[ ]`、およびその範囲`-`
* ブラケット内に列挙されているもの以外の文字`[^ ]`
* 0回以上の繰り返し`*`
* 1回以上の繰り返し`+`
* 0回、もしくは1回`?`
* 指定されたパターンのいずれか`|`
* グループ化`()`

また、`\`によってメタ文字をエスケープすることができますが、Unquated Argument および Quated Argument で用いる場合は、CMake のエスケープとバッティングするため`\\`としないといけないことに注意してください。

## 後方参照

CMake の正規表現で、グループ化されたものは`CMAKE_MATCH_<n>`変数で参照することができます(`<n>`は0から9)。`CMAKE_MATCH_0`にはマッチした文字列全体が格納されています。また、`string(REGEX REPLACE)`コマンドでは、置換後の文字列内で`\<n>`という形(`<n>`は0から9)で後方参照することができます。このとき、Unquated Argument および Quated Argument の場合は`\\`としないといけないことに注意してください。

```cmake
if("123-dd" MATCHES [[([0-9]+)-dd]])
  message("$1: ${CMAKE_MATCH_1}") # $1: 123
endif()

string(REGEX REPLACE [[([0-9]+)-dd]] [[\1]] replaced "123-dd")
message("replaced: ${replaced}") # replaced: 123
```

## 正規表現が使える場所

以下の場所で正規表現が使用できます。

### コマンド

* [`string(REGEX MATCH)`コマンド](http://www.cmake.org/cmake/help/v3.0/command/string.html)
* [`string(REGEX MATCHALL)`コマンド](http://www.cmake.org/cmake/help/v3.0/command/string.html)
* [`string(REGEX REPLACE)`コマンド](http://www.cmake.org/cmake/help/v3.0/command/string.html)
* [`file(STRINGS)`コマンド](http://www.cmake.org/cmake/help/v3.0/command/file.html)
* [`if(MATCHES)`コマンド](http://www.cmake.org/cmake/help/v3.0/command/if.html)
* [`install(DIRECTORY)`コマンド](http://www.cmake.org/cmake/help/v3.0/command/install.html)
* [`source_group()`コマンド](http://www.cmake.org/cmake/help/v3.0/command/source_group.html)
* [`include_regular_expression()`コマンド](http://www.cmake.org/cmake/help/v3.0/command/include_regular_expression.html)
* [`ctest_test()`コマンド](http://www.cmake.org/cmake/help/v3.0/command/ctest_test.html)
* [`ctest_memcheck()`コマンド](http://www.cmake.org/cmake/help/v3.0/command/ctest_memcheck.html)

### 変数・プロパティ

* [`CMAKE_LIBRARY_ARCHITECTURE_REGEX`変数](http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_LIBRARY_ARCHITECTURE_REGEX.html)
* [`INCLUDE_REGULAR_EXPRESSION`ディレクトリプロパティ](http://www.cmake.org/cmake/help/v3.0/prop_dir/INCLUDE_REGULAR_EXPRESSION.html)
* [`FAIL_REGULAR_EXPRESSION`テストプロパティ](http://www.cmake.org/cmake/help/v3.0/prop_test/FAIL_REGULAR_EXPRESSION.html)
* [`PASS_REGULAR_EXPRESSION`テストプロパティ](http://www.cmake.org/cmake/help/v3.0/prop_test/PASS_REGULAR_EXPRESSION.html)

### モジュール

* [`ExternalData`モジュール](http://www.cmake.org/cmake/help/v3.0/module/ExternalData.html)
* [`CMakeGraphVizOptions`モジュール](http://www.cmake.org/cmake/help/v3.0/module/CMakeGraphVizOptions.html)
* [`CPack`モジュール](http://www.cmake.org/cmake/help/v3.0/module/CPack.html)
* [`CheckCSourceCompiles`モジュール](http://www.cmake.org/cmake/help/v3.0/module/CheckCSourceCompiles.html)
* [`CheckCXXSourceCompiles`モジュール](http://www.cmake.org/cmake/help/v3.0/module/CheckCXXSourceCompiles.html)

### コマンドライン

* [`ctest`コマンド`-L`オプション](http://www.cmake.org/cmake/help/v3.0/manual/ctest.1.html#options)
* [`ctest`コマンド`-R`オプション](http://www.cmake.org/cmake/help/v3.0/manual/ctest.1.html#options)
* [`ctest`コマンド`-E`オプション](http://www.cmake.org/cmake/help/v3.0/manual/ctest.1.html#options)
* [`ctest`コマンド`-LE`オプション](http://www.cmake.org/cmake/help/v3.0/manual/ctest.1.html#options)

## おわりに

以上、CMake における正規表現についてでした。CMake の正規表現は、Ruby や Perl などと比べると貧弱なので高度なことはできないことに注意が必要です。

明日は、mrk_21 さんの『CMake: 便利なコマンド・変数』です。