5年くらい前に正規表現について勉強したときのメモが出てきたので残しておきます。とりあえずここに書いてあることを抑えておけば、ある程度の正規表現は書けると思います。
この記事出てくる「基本正規表現」とは grep
, sed
, Vim
などで利用する時の正規表現です。基本正規表現では、通常の「拡張正規表現」と違って、エスケープが必要なメタ文字があります。
目次
文字クラス
.
任意の 1 文字。改行を含まない。
\d
数字 1 文字。[0-9]
と同じ。sed
では利用できない。
\D
数字 1 文字以外。[^0-9]
と同じ。sed
では利用できない。
\w
英数字 1 文字。[a-zA-Z0-9]
と同じ。
\W
英数字 1 文字以外。[^a-zA-Z0-9]
と同じ。
\s
空白文字 1 文字。スペース、改行、タブ。[\t\n\r\f\v]
と同じ。sed
では利用できない。
\S
空白文字 1 文字以外。[^\t\n\r\f\v]
と同じ。sed
では利用できない。
\t
タブ 1文字。
\n
改行 1文字。
位置の指定
^
先頭。
$
行末。
文字集合
[...]
カッコの間に指定された文字のいずれか 1 文字。[abc]
のように指定する。
[^...]
カッコの間に指定された文字のいずれか 1 文字以外。[^abc]
のように指定する。
[a-z]
a から z までの文字のいずれか 1 文字。大文字アルファベットは [A-Z]
。数字は [0-9]
。英数字は [A-Za-z0-9]
。ハイフンを含めたい場合は [-a-z]
のように先頭に指定する。
(...)
カッコの間に指定された文字列をひとつのグループとして管理する。(abc)
のように指定する。基本正規表現では \(\)
のようにエスケープする。
(...|...)
前後に指定された文字列のいずれか。(abc|def) のように指定する。基本正規表現では \| のようにエスケープする。
量指定子
*
直前に指定された文字の 0 回以上の繰り返し。
+
直前に指定された文字の 1 回以上の繰り返し。基本正規表現では \+
のようにエスケープ。
?
直前に指定された文字の 0 回または 1 回の繰り返し。基本正規表現では \?
のようにエスケープ。
{n}
直前に指定された文字の n 回の繰り返し。基本正規表現では \{\}
のようにエスケープ。
{n,}
直前に指定された文字の n 回以上の繰り返し。基本正規表現では \{n,\}
のようにエスケープ。
{,m}
直前に指定された文字の m 回以下の繰り返し。基本正規表現では \{,,m\}
のようにエスケープ。
{n,m}
直前に指定された文字の n 回以上 m 回以下の繰り返し。基本正規表現では \{n,m\}
のようにエスケープ。
後方参照
()
で囲まれた文字列を記録しておき、置換する時に \1
で再利用できます。()
が複数ある場合は、()
の順番に \1
, \2
のようにして指定できます。うまく使うとテキスト編集作業が格段に早くなります。マスターしましょう。
最長一致
www.example.com
という文字列に対して、.*\.
という正規表現を指定すると、www.example.
にマッチします。これを www.
にマッチさせたい場合は、.*?\.
のように指定します。状況に応じて使い分けましょう。
練習問題として解いた例題
例題1
次の文字列をエディタで置換しなさい。
置換前
$array_hoge['piyo_huga'] = array();
$array_hoge['hoge_piyo'] = array();
置換後
$array_hoge['piyo']['huga'] = array();
$array_hoge['hoge']['piyo'] = array();
例題2
文字列をシングルクォートで囲みなさい
置換前
abc123あいう
def456かきく
置換後
'abc123あいう'
'def456かきく'
例題3
空行を除去しなさい
置換前
abc
123
あいう
def
456
置換後
abc
123
あいう
def
456
解答例1
検索
\['([a-z]+)_([a-z]+)'\]
置換
[\1']['\2]
解答例2
検索
^(.+)$
置換
'\1'
解答例3
検索
(\n){2,}
置換
\n
オススメ書籍
-
詳説 正規表現 第3版
正規表現はこれ一冊で OK。
良書です。一見分厚くて手に取るのをためらいますが、冒頭の 100 ページあたりを読むだけで、正規表現の基本は抑えることができます。あとのページは言語ごとの正規表現の解説なので、必要に応じて読みましょう。