正規表現?ワイルドカード?

シェアする

  • このエントリーをはてなブックマークに追加

こんにちは!早速ですが、

正規表現ワイルドカード

これらはパターンマッチング手法の1つで、あるパターンを決めて、それにマッチする文字列を見つけるために使うものです。

ITの勉強をしていると何かと現れるやつですが、それぞれの区別はついていますか?
私は最近になるまで同じ様なものだと認識していましたが、全く違いました…(-_-;)

今回はそれらの違いについて簡単にまとめていきたいと思います!

正規表現とは?

正規表現(せいきひょうげん、: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである

引用元:正規表現 – Wikipedia

「正規」というのは、一定のルールで作られていることです。
複数の文字列を、1つの文字列で表す場合に正規表現を用います。

例えば、以下のような感じです。

これによって、元々5つの文字列それぞれに対して行わなければならなかった処理を、正規表現で表した1つの文字列に対して行うだけでよくなります。

実際の正規表現では、メタキャラクタと言われる特殊な意味を持つ文字を使って表します。

メタキャラクタ 意味
^ (ハット) 文字列の先頭
$ (ドル) 文字列の末尾
. (ピリオド) 任意の1文字
* (アスタリスク) 直前にある文字の0回以上の繰り返し
+ (プラス) 直前にある文字の1回以上の繰り返し
? (クエスチョン) 直前にある文字の0回または1回の繰り返し

※実際はもっとあり、それだけ細かく表現できます。

これにならって正規表現を作ってみると、以下のようになります。

ワイルドカードとは?

コンピュータなどの関連において、ワイルドカードは、検索などグロブの際に指定するパターンに使用する特殊文字の種類で、どんな対象文字、ないし文字列にもマッチするもののことである。

引用元:ワイルドカード (情報処理) – Wikipedia

ワイルド(wild):万能な
カード(card):手段

直訳すると「万能な手段」です。
どんな文字列にもマッチするから万能?

しかし機能としてはそれだけなので、正規表現と比べれば非常に単純な作りになっています。

特殊文字の種類とあるように、ワイルドカードは先程の正規表現で使用したメタキャラクタの仲間で、特殊な意味を持つ文字のことです。

ワイルドカード 意味
? (クエスチョン) 任意の1文字
* (アスタリスク) 0文字以上の任意の文字列

どうでしょうか?
明らかに正規表現よりも細かい表現はできません。

これでは、文字列の先頭や末尾の指定もできないため、「おいしいおもち」という文字列があってもマッチします。

ちなみにデータベースで使われるSQLでは、

ワイルドカード 意味
_ (アンダーバー) 任意の1文字
% (パーセント) 0文字以上の任意の文字列

となっており、意味は同じですが文字が変わります。

ややこしい!!!!!

ここからが本題です。

なんだかややこしいことは感じて頂けたかと思いますが、個人的にややこしいと思うことを列挙してみます。

① SQLのワイルドカードは文字が変わっている

?(クエスチョン) → _(アンダーバー)
*(アスタリスク) → %(パーセント)

これはどちらも学習したことがあれば時間が経った頃には迷ってしまうと思います。
覚えるしかありませんね。

② ワイルドカードは表現そのものと特殊文字どちらも表している
ワイルドカードは特殊文字のことだとばかり思っていたせいで、正規表現にある ?(クエスチョン)や *(アスタリスク)もワイルドカードだと勘違いしていました。

表現名 特殊文字
正規表現 メタキャラクタ
ワイルドカード ワイルドカード

大きく見れば似たようなものですが、
このように別々のものだと考えるようにしました。

③ 共通している特殊文字の意味がそれぞれで違う
正規表現とワイルドカードで共通している文字についてまとめました。

まず、?(クエスチョン)の意味です。

正規表現 直前にある文字の0回または1回の繰り返し
ワイルドカード 任意の1文字

(゚A゚;)ゴクリ…

次に、*(アスタリスク)の意味です。

正規表現 直前にある文字の0回以上の繰り返し
ワイルドカード 0文字以上の任意の文字列

…。

ややこしい!!!

以前まで同じものだと勘違いしていました。。。

正規表現では、直前に文字がなければそれ単体では使用できません。そのため、ワイルドカードでの*(アスタリスク)を正規表現で表す場合、

.* とする必要があります。

. が、任意の1文字
* が、直前にある . の0回以上の繰り返し

つまりこれで、任意の文字列となります。

2つが違うということに気付いたのは、
Cisco機器を操作していたときでした。

インタフェースとMACアドレスの対応を見やすく表示しようと思い調べたところ、| (パイプ)とincludeを使った例を見つけました。

ちなみにヘルプを見ると、正規表現を使用することがわかります。

SW# show interfaces | include ?
LINE Regular expression.

そのとき入力したコマンドが以下です。(黄色い部分が正規表現にマッチしたところ)

SW# show interfaces | include (.*line|.*address)

FastEthernet0/1 is down, line protocol is down (disabled)
Hardware is Lance, address is XXXX.XXXX.XXXX (bia XXXX.XXXX.XXXX)
FastEthernet0/2 is down, line protocol is down (disabled)
Hardware is Lance, address is XXXX.XXXX.XXXX (bia XXXX.XXXX.XXXX)
FastEthernet0/3 is down, line protocol is down (disabled)
Hardware is Lance, address is XXXX.XXXX.XXXX (bia XXXX.XXXX.XXXX)

–More–

include ○○ は、○○を含む行を抽出します。
(○○|□□)は、○○または、□□を含む行を抽出します。

これできちんと抽出できましたが、
当時はピリオドの必要性を全く理解していませんでした。

試しにアスタリスクのみでやってみると、

SW# show interfaces | include (*line|*address)

FastEthernet0/1 is down, line protocol is down (disabled)
Hardware is Lance, address is XXXX.XXXX.XXXX (bia XXXX.XXXX.XXXX)
BW 100000 Kbit, DLY 1000 usec,
reliability 255/255, txload 1/255, rxload 1/255

…..

FastEthernet0/24 is down, line protocol is down (disabled)
Hardware is Lance, address is XXXX.XXXX.XXXX (bia XXXX.XXXX.XXXX)
BW 100000 Kbit, DLY 1000 usec,
reliability 255/255, txload 1/255, rxload 1/255

–More–

全ての情報が表示されてしまいました。
ここでの*(アスタリスク)は直前に文字がないため、正規表現として認識されずincludeそのものが機能しなかったようです。

しかし以下の資料を見るとワイルドカードとしても動作すると書いてありますが、今回の例では機能していない?みたいです。他に使い所があれば教えて頂きたいです。

Regular Expression Character Function
* Matches zero or more sequences of the character preceding the asterisk. Also acts as a wildcard for matching any number of characters.

引用元:Cisco regular expressions – CiscoZine.com

まとめ

今回改めてまとめてみましたが、それぞれの特徴と違いが理解できました。

正規表現 様々なメタキャラクタを使用した細かい表現が可能
ワイルドカード 2つのワイルドカードを使用した単純な表現が可能

場面によってどちらを使うのかしっかり見極めたいと思います。

参考:正規表現あれこれ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントをどうぞ!

avatar
  Subscribe  
更新通知を受け取る »