「正規表現」タグアーカイブ

正規表現の一枚上手な検索術


私たちは普段インターネット上でキーワード検索を行っています。
 
さらに最近ではブラウザの機能向上により検索したホームページ上でさらにキーワード検索を行うことが出来ます。
 
このような検索技術は大変便利であるがために、先人たちの知恵によって検索技術が格段に進歩しました。
 
今では技術者くらいしか扱わない「正規表現」という知識を用いた検索技術も身近になってきました。
IMG_20160727_162314
 
ここで、正規表現について簡単に説明すると、曖昧さを持つキーワードを検索するための工夫です。
 
例えば文章から「SmartPhone」を検索するために「SmartHone」と検索しても通常の検索では見つかりません。
 
なぜなら、キーワードが完全に一致していないからです。
 
しかし、正規表現を用いると、PhoneだったかHoneだったかは別において、「Smart(P|)hone」として検索をするとこの’P’があるかどうかといった曖昧さを回避することが出来ます
IMG_20160727_162449
 
そして結果として「SmartPhone」と「SmartHone」の両方を見つけることが出来ます。
これが、正規表現の魅力です。
 
その他にも、電話番号のある1桁の数値を覚え忘れてしまってもその程度の曖昧さであれば見つけ出すことも可能です。
 
例えば「08011112222」だったか「07011112222」だったかで忘れてしまっても、検索欄に「0[7-8]011112222」とすれば、両方のキーワードを含む文字列を検索してくれます。
IMG_20160727_162535
 
さらに応用すると、アルファベット文字と数字、ハイフンを含む文字列パターンだけを見つけることが出来ます。
 
その正規表現は「(A-Za-z0-9-]+)」です。一見して複雑そうですが、これはまだまだ簡単な方です。
 
もともと、古くからはワイルドカードといって不明な文字を*として検索をかける仕組みは以前からありました。
 
ところが、Web開発の途中でPerlやPHPといった文字列を扱うプログラミング言語が登場してからは、人の目で確認するのにも限界があるということで正規表現という手法が編み出されたといわれています。
 

正規表現をマスターしておけば文字列の編集をする上で効率が非常に良くなります。

 
また、現在の有名なプログラミング用エディタには正規表現の機能が備わっています。
 
しかし残念なことに、まだ正規表現は正式には規格化されておらず、検索するエディタによって正規表現の形式が異なります
 
とはいっても、今後文字列に検索をかける上で完全一致型の検索はミステイクにもつながりますから、少なくともワイルドカードという存在だけでも覚えて使ってみて欲しいと思います。
 
また、更に興味があれば是非、正規表現もマスターしてみて下さると幸いです。
 


よく使う正規表現のまとめ


よく使う正規表現を纏めました。

 

VB.net/C#/PHP/Perl ・・・etc 言語関係無く使われます。全てを覚える事は難しいので必要に応じてマトリクスを活用してください。

○文字系

記号 意味
. 任意の1文字
* 直前の文字の0回以上の繰り返し*1
+ 直前の文字の1回以上の繰り返し*1
? 直前の文字は省略可能*1
*? 直前の文字の0回以上の繰り返し*2
+? 直前の文字の1回以上の繰り返し*2
?? 直前の文字は省略可能*2
[ ~ ] [ ]の中のどれか1文字*5
[^ ~ ] [ ]の中に無い1文字*5
( ~ | … ) ~か…かどっちか
{n} 直前の文字のn回の繰り返し
{min,max} 直前の文字のmin以上max以下の繰り返し(min、maxは省略可能)*1
{min,max}? 直前の文字のmin以上max以下の繰り返し(min、maxは省略可能)*2
\w アルファベット、数字、アンダスコア( _ )のどれかの1文字
\W アルファベット、数字、アンダスコア以外の1文字
\d 数字1文字
\D 数字以外の1文字
\s 半角スペース、タブ、改行のどれか1文字
\S 半角スペース、タブ、改行以外の1文字
\n 改行
\t タブ
\\ \記号
( ~ ) ( )内を1文字扱い

○位置系*3

記号 意味
^ 行の先頭
$ 行の末尾
\< 単語の先頭
\> 単語の末尾
\b 単語の先頭か末尾
\B 単語の先頭、末尾以外
\A ファイルの先頭
\z ファイルの末尾
\G 直前の一致文字列の末尾

○置換文字列で使える正規表現

記号 意味
\0 一致した文字列全体
\1 \2 … \9 それぞれ検索文字列の1~9番目の ( ) に一致した文字列*4
\l 次の1文字を小文字にする
\L ~ \E 挟まれた文字列を小文字にする
\u 次の1文字を大文字にする
\U ~ \E 挟まれた文字列を大文字にする
\n 改行
\t タブ
\\ \記号

*1 最長一致と呼ばれ、条件に合う一番長い部分に一致します。
*2 最短一致と呼ばれ、条件に合う一番短い部分に一致します。
*3 「位置系」の記号は「特定の文字列」ではなく「特定の位置」に一致します。
*4 ( ) の順番は ( が現れる順番です。
*5 [ ] 内で正規表現は使えません