正規表現に関して Regex
「正規表現」を学ぶことで、効果的に情報を探索できる
正規表現を実装する際に、重要なことまとめ
「正規表現」には「メタ文字」と呼ばれる特殊な文字があり
この「メタ文字」を使うことで複雑な文字列を表現します
正規表現を使いこなすには「メタ文字」の使いこなしが必須!
分かりやすい簡単な「メタ文字」を使うだけで
複雑な文字列を表現できるようになります
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_]+
結果
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 |
勉強になる本が以下の本