2015年4月8日水曜日

正規表現の動作を手軽に検証する方法

Linuxのシェルスクリプトを作る時などで、正規表現を使えるとロジックが綺麗になる場合があるが、正規表現が頭の中で組み立てたものが、果たして想定通りの動きをしてくれるか不安になることが多い。

はじめはLinuxで検証用のスクリプトでも作ろうかと思ったのだが、よく考えたら正規表現を使えるコマンドがPower Shellにあるので、それを使えばお手軽に端末で正規表現の検証をできることに気がついたので、方法について記載する。

正規表現検証方法

例えば以下の様なテキストファイルを作るとする。ファイル名は適当に「test.txt」とする。

patternAAA01
patternBBB02
patternXXX003
patternYY04
patternZZZ5
ApatternCCC06

この中から「pattern + 英字大文字3文字 + 数字2桁」の条件で抜き出せる正規表現を考えていくことにする。

まず考えた正規表現は以下の通りになったとする(先に言ってしまうと、これでは最適な結果は得られない)。

<正規表現>
pattern[A-Z]{3}\d{2}

これを検証する方法は、別記事で書いた「Windows標準コマンドでgrepする」で記載した"Select-String"コマンドレットを使えば良い。"-Pattern"のオプションを使えば正規表現での検索が使える。

<コマンド>
Select-String .\test.txt -Pattern "pattern[A-Z]{3}\d{2}"

<結果>
test.txt:1:patternAAA01
test.txt:2:patternBBB02
test.txt:3:patternXXX003
test.txt:6:ApatternCCC06

上記の結果の通り、No3とNo6が余計に引っかかってしまった。改良して以下の正規表現にしてみる。

<正規表現>
^pattern[A-Z]{3}\d{2}$

<コマンド>
Select-String .\test.txt -Pattern "^pattern[A-Z]{3}\d{2}$"

<結果>
test.txt:1:patternAAA01
test.txt:2:patternBBB02

想定通りの動作となる正規表現であることが確認できた。

参考URL

.NET Framework の正規表現
https://msdn.microsoft.com/ja-jp/library/hs600312(v=vs.110).aspx

正規表現言語 - クイック リファレンス
https://msdn.microsoft.com/ja-jp/library/az24scfc(v=vs.110).aspx