「正規表現」を学ぶことで、効果的に情報を探索できる

正規表現を実装する際に、重要なことまとめ

「正規表現」には「メタ文字」と呼ばれる特殊な文字があり

この「メタ文字」を使うことで複雑な文字列を表現します

正規表現を使いこなすには「メタ文字」の使いこなしが必須!

分かりやすい簡単な「メタ文字」を使うだけで

複雑な文字列を表現できるようになります

1.「文字種」を指定するメタ文字

メタ文字意味備考
.すべての文字改行は除く
[125]1,2,5のどれか備考
[0-9]数字[0123456789]と同じ
[a-z]アルファベット小文字[abcdefghijklmnopqrstuvwxyz]と同じ
[A-Z]アルファベット大文字大文字/小文字を区別しない方法もある
[0-9a-z]数字またはアルファベット小文字
[^0-9]0~9以外の文字^はいわゆる論理演算の否定「not」
[ぁ-ん]ひらがな「ぁ」は拗音(ちいさい文字)
[ァ-ヴ]カタカナ「ァ」は拗音(ちいさい文字)
ヲ-゚半角カタカナ最後は半角の半濁点「゜」

どの「文字種」が使われているかを指定するメタ文字です

上のような表記であらわせる文字数は「1文字」だけ

文字数の指定には別途繰り返しを意味するメタ文字が必要です

例えば、「.(ドット)」は任意の一文字をあらわします

「.(ドット)」はよく使うのでこれだけは絶対に覚えておきましょう

ちなみに、「-(ハイフン)」を使った表記は 「文字コードが XXXX から YYYY までの文字」という意味

「ひらがな」「カタカナ」のスタートが拗音(小さい文字)である理由は

その文字種の文字コードが拗音からはじまるためです

(「半角カタカナ」の表記も同様の理由)

2.「繰り返し」を指定するメタ文字

メタ文字意味備考
*0回以上繰り返す+との違いを使い分けよう
+1回以上繰り返す*との違いを使い分けよう
?0または1回有っても無くても良いものに使う
{5}5回繰り返す
{5,}5回以上繰り返す
{5,9}5回以上9回以下繰り返す

文字の「繰り返し」を指定するメタ文字です

例えば、数字が0回以上の繰り返すという正規表現は

「[0-9]*」のように記述します

「*」「+」による繰り返しはよく使います

それぞれ「0回以上」「1回以上」という違いがあるので

上手く使い分けましょう

「?」は、例えば「http」と「https」両方を対象にしたい場合

「s」は有っても無くてもよいものと言えるので

「https?」のように使います

3.「位置」を指定するメタ文字

メタ文字意味備考
^先頭[]内では「否定」の意味になるので注意
$末尾
¥b単語境界単語の末尾や先頭のこと
¥B単語境界以外

文字列がどの「位置」にあるかを指定するメタ文字です

例えば、先頭が「http」からはじまるという正規表現は

「^http」のように記述します

基本は、先頭,末尾 を意味する

「^」「$」さえ知っていれば大体のことは間に合います

ただし、「^」は「[ ] 」内だと否定の意味になるので注意

ちなみに、「\b」の「単語境界」とは単語の先頭,末尾のこと

例えば、正規表現で「e\b」とした場合

「cute and clever elichika」で該当するのは

「cute」の末尾の「e(赤字部分)」だけで、他の「e」は該当しません

4.「選択」をあらわすメタ文字

メタ文字意味備考
|選択(AまたはB)いわゆる論理演算の論理和「or」

「AまたはB」ような「選択」をあらわすメタ文字です

例えば、正規表現で「No(zomi|ntan)」と書いた場合

「No」の続きは「zomi」と「ntan」から選択することになり

「Nozomi」と「Nontan」という2つの文字列をあらわします

普通なら2つの文字列を別々に書く必要があるものを

一つの正規表現であらわせるわけです

ちなみに、「選択」は複数使用できるので

「No(zomi ntan nnon)」のようにさらに追加できます

5.エスケープ文字

メタ文字意味備考
¥..(ドット)
¥**
¥++
¥??
¥^^
¥$$
¥||
¥--
¥¥¥¥
¥[[
¥]]
¥{{
¥}}
¥((
¥))
¥//使用言語によっては「/」だけでも可
¥""使用言語によっては「"」だけでも可

「.(ドット)」をはじめとした「メタ文字」で特殊な意味を持つ文字は

そのままでは「普通の文字」として使うことができません

例えば、正規表現で「www.lovelive.jp」という文字列を作るには

「www\.lovelive\.jp」のように

「.(ドット)」の前に「\」を書く必要があります

このような方法を「エスケープ」と言います

また、「\」自体もエスケープを意味する特殊な文字なので

普通の文字として「\」を使うには「\」と書く必要があります

ちなみに、「\」はフォントによって表示が異なる文字です

海外のフォントでは、半角の「\(バックスラッシュ)」

日本語のフォントでは、半角の「¥(円記号)」で表示されます

6.その他のメタ文字

メタ文字意味備考
¥n改行
¥tタブ
¥s空白[¥f¥n¥r¥t¥v]と同じ
¥S空白以外[^¥f¥n¥r¥t¥v]と同じ
¥d半角数字[0-9]と同じ
¥D半角数字以外[^0-9]と同じ
¥l半角英小文字[a-z]と同じ
¥L半角英小文字以外[^a-z]と同じ
¥u半角英大文字[A-Z]と同じ
¥U半角英大文字以外[^A-Z]と同じ
¥w半角英数字と_(アンダーバー)[a-zA-Z0-9]と同じ
¥W半角英数字と_(アンダーバー)以外[^a-zA-Z0-9]と同じ

特殊な意味を持つメタ文字です

「改行」「タブ」「空白」を意味する

「\n」「\t」「\s」を知っていれば大体は何とかなります

(アルファベットを大文字にすると「否定(Aでない)」の意味になる)

「\d」「\l」「\u」「\w」などは記述を省力化できて便利ですが

文字種の指定でも間に合うので無理に覚えなくてもいいです

「\」が付くメタ文字が機能しない場合

例えば、JavaScript の「文字列リテラル」の部分

つまり「”」や「’」で囲まれた文字列を記入する部分では

正規表現の「\n」「\d」「\」などが正常に機能しません

そのような場合、「\」を「\」に置き換えてみて下さい

「\n」→「\n」,「\d」→「\d」,「\」→「\\」といった感じです

これで正常に機能するようになると思います

var re = RegExp("\d+円");
          ↓
var re = RegExp("\\d+円");

ちなみに、動かない原因は

JavaScript においても「\」がエスケープを意味する文字だからです

例えば、文字列リテラルに書いた「\d」は

JavaScript によりエスケープ文字として扱われます

しかし、JavaScript には「\d」という表記は存在しないので

「\」が削除され、単なる「d」に変換されます

結果、「d」が正規表現に送られるため正常に機能しないわけです

(同様に、「\」は「\」に変換されてから正規表現に送られる)

ちなみに、次のように文字列リテラルを使わない方法で記述をすれば

通常どおりに記述をしても機能します

 var re = /\d+円/;

文字列リテラルに正規表現を記述する場合は

プログラミング言語によるエスケープの違いに注意

Regexperという名のWebサイト

「正規表現」を超わかりやすい図に変換してくれるサービス

複雑な正規表現ではさらにサイトの威力を発揮

正規表現を作るときはぜひ活用してみて下さい

これをコピペして結果を表示して確認

^https?:\/\/twitter\.com\/[a-zA-Z0-9_]+

→ 「Regexper」へ行ってみる

結果

End of Lineがない!!修正せねば!!

^https?:\/\/twitter\.com\/[a-zA-Z0-9_]+\/$

と微妙な間違いに気がつく。

また、正規表現を書く練習にもなる

使用方法

拡張子に関する正規表現の例

URLの最後が「.gif, .jpg, .jpeg, .png, .bmp」のいずれかで終わる正規表現

^https?:\/\/[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp)$

タグのsrc部分のURL指定は、相対指定―’http://’ ではじまらない―があることがある

また、拡張子は画像限定なので、jpg, jpeg, gif, png, bmp の

5種類を対象とすることにする これを正規表現で表すと以下のようになる

<img(.*)src=\"?([\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(jpg|jpeg|gif|png|bmp))\"?$

WEBサイトのURLに関する正規表現の例

分類どこでA/Bしたいか?正規表現マッチするURL例マッチしないURL例
基本トップサイト^http://example.com(\?.+)?$http://example.com
http://example.com?x=1</br/>http://example.com?x=1&y=2
http://example.com/bar
http://example.com/bar?x=1
パス配下の全ページ^http://example.com/bar/http://example.com/bar/
http://example.com/bar/buz
http://example.com/bar/?x=1
http://example.com/bar/?x=1&y=2
http://example.com/bar/buz?x=1
http://example.com
http://example.com?x=1
http://example.com/wee/
http と httpsどちらも同じコンテンツを返すページ^http(|s)://example.com/(\?.+)?$http://example.com/
https://example.com/
http://example.com/?x=1
https://example.com/?x=1
http://example.com/bar
https://example.com/bar?x=1
www. がつくorつかない,どちらも同じコンテンツを返すページ^http://(www\.)?example.com/(\?.+)?$http://example.com/
http://example.com/?x=1
http://www.example.com/
http://www.example.com/?x=1
http://dashboard.example.com/
http://example.com/bar
http://example.com/bar?x=1
http://www.example.com/bar
/ と index.htmlどちらも対応^http://example.com/(index\.html)?(\?.+)?$http://example.com/
http://example.com/?x=1
http://example.com/index.html
http://example.com/index.html?x=1
http://example.com/bar
http://example.com/bar.html
http://example.com/bar/index.html
複数ページ指定した幾つかのパスのみ^http://example.com/(abc|def|ghi)/(\?.+)?$http://example.com/abc/
http://example.com/def/
http://example.com/ghi/
http://example.com/abc/?x=1&y=2
http://example.com/jkl/
http://example.com/abc/123
ブログのエントリページやECサイトの商品ページなどパスに一定ルールが存在するもの^http://example.com/item/\d+(\?.+)?$http://example.com/item/123
http://example.com/item/456
http://example.com/item/789
http://example.com/item/123?x=1
http://example.com/
http://example.com/bar/
http://example.com/item/123/cart
http://example.com/item/abc
GET パラメータ指定指定するGETパラメータが含まれていた場合のみ^http://example.com/\?<ad_code=123>http://example.com/?ad_code=123
http://example.com/?ad_code=123&x=1
http://example.com/?x=1&ad_code=123
http://example.com/
http://example.com/?ad_code=456
http://example.com/bar?ad_code=123
指定する複数のGETパラメータが含まれていた場合のみ^http://example.com/\?<ad_code=123>&<from=.+?>http://example.com/?ad_code=123&from=1
http://example.com/?ad_code=123&from=2
http://example.com/?ad_code=123&from=2&x=1
http://example.com/?from=1&x=1&ad_code=123
http://example.com/?ad_code=456&from=1
http://example.com/?from=2
http://example.com/?ad_code=123

勉強になる本が以下の本



Published

09 June 2015

Tags