一目でわかるワイルドカードと正規表現の違いと使い方

ワイルドカードと正規表現は全くの別物

ワイルドカードと正規表現はどちらも文字列の集合を表現するための方法である。二つの言葉は、現場では混同されがちだが別のものである。本稿では、ワイルドカードと正規表現の違いと、それぞれの基本的な使い方を紹介したい。

 

どちらの方法も、システム開発を行っていると様々な場面で利用されるものであるため、理解が曖昧な場合はしっかりと区別できるようにしておこう。

 

ワイルドカード

 

1. 長さ0文字以上の連続した任意の文字列 : *
2. 任意の一文字 : ?

 

という2種類の表現を使うことで、条件にマッチする文字列を探すことが可能だ。また、上記以外の複雑な条件判断は行うことができない。

 

UNIX系とWindows系(MS-DOS)それぞれで実装されているが、*を指定した際の対象に仕様の差がある。具体的には、UNIX系では*の後に文字列がある場合はそれも条件として扱われるが、Windows系では*の後に文字列があった場合は全て無視される。

 

例:

カレントディレクトリ配下に以下のファイルが存在する場合。

 test_20170801.dat
 test_20170802.dat
 test_20170803.dat

 

Case 1. ワイルドカード「test_*.dat」の対象

[UNIX]
test_20170801.dat
test_20170802.dat
test_20170803.dat

 

[Windows]
test_20170801.dat
test_20170802.dat
test_20170803.dat

 

Case 2. ワイルドカード「test_*.log」の対象

[UNIX]
対象なし

[Windows]
test_20170801.dat
test_20170802.dat
test_20170803.dat

他には、SQLにおいてもLIKE演算子でワイルドカードを使った表現が可能である。SQLでは、*の代わりが%?の代わりが_として扱われる。

 

図. ワイルドカードの種類と表現方法

 

ワイルドカードが有効な場面

UNIX系,Windows系のどちらのOSでも利用可能であることと、記法がシンプルであるため、あらゆる場面で利用可能だが、主に作業でCUI操作する場合などに効果を発揮する。

 

逆に、大味な表現となるため、プログラム処理中で利用する場合は、処理の対象範囲が想定外に広がってしまわないように注意が必要だ。

 

 

例として、 /tmp/ 配下に毎日作成される tmp.dat というデータファイルと、 tmp.log というログファイルを毎日削除するためのプログラムを作成する場合について考えてみよう。

 

ワイルドカードを使って rm -f /tmp/*.* などと記載してしまうと、 userdata.dat というファイルも誤って削除されてしまった。などということが発生しうる。この場合は rm -f /tmp/tmp.??? と記載するなど、対象範囲をできるだけ絞って記載することが事故を防ぐコツだ。

 

 

正規表現

ワイルドカードができることに加え、さらに複雑な条件を指定することができる表現。出現する文字列をOR条件や集合で表現できることに加え、行の先頭や末尾といった文字列の発生箇所も条件に含めることが可能だ。

 

正規表現の具体的な記法については、以下のサイトがわかりやすいので参考にして欲しい。

参考サイト(外部)
サルにもわかる正規表現入門

 

また、正規表現には複数の演算子が存在しており、ツールや環境によって利用可能な演算子が異なる。現場で実装する際には、利用するツールの仕様を確認する必要があるが、基本的には、標準正規表現(BRE:Basic Regular Expression)と呼ばれる基本の演算子を抑えておけば、たいていの条件には対応できるはずだ。

 

 

 

正規表現が有効な場面

正規表現は、複雑な条件を設定することが可能であるため、プログラム処理や検索対象の文字列が複数ある場合に向いている。しかし、便利だからといって複雑な表現を書きすぎるとソースの可読性が低下し保守性の低いプログラムになるため、できる限りシンプルな表現にすることを心がけよう

 

まとめ

  • 同じ目的で使われるが、正規表現とワイルドカードは別物
  • 正規表現のほうが複雑な条件を表現できる
  • 正規表現には複数の流派が存在し、ツールにより使える表現が若干異なる

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です