ゼロからの正規表現超入門講座

Pocket

正規表現を一度、覚えてしまえばプログラミングはグッと楽になります!

この講座は、「正規表現ってなーに?おいしいの?」というレベルから、まずは単純な正規表現を理解できるようになることを目的としています。

正規表現を覚えると文字列の操作が楽になり、プログラミングがグッと楽になります。是非、この正規表現入門講座で正規表現の面白さを体感して下さい!

メタキャラクタとは

メタキャラクタとは、文字を表す文字のことです。って説明してもサッパリわかりませんよね。具体例を挙げると分かりやすいと思います。例えば、\dは全ての数字を表します。1も3も5も\dです。

確かに、\dは文字を表す文字ですよね?

このような抽象的な文字のことをメタキャラクタと呼びます。

もう1つ具体例を見てみましょう。

例えば、「.(ドット)」は、全ての文字を表します。具体的には、い..と書くと、「い」で始まる3文字の単語を表します。例えば、「いかだ」や「いずみ」は「い」で始まる3文字なのでい..で表現できます。また例えば、単に…..とドットを5個つなげれば、あらゆる5文字の言葉を表します。

先ほどの例に戻りますが、\dは全ての数字を表すメタキャラクタでした。例えば3にあてはまります。この「あてはまる」ことをマッチすると言います。例えば、は任意の3文字を表すので「リンゴ」や「バナナ」にマッチします。

正規表現のメタキャラクタの種類

「.(ドット)」

先ほども登場しましたね。任意の文字を表します。例えばは、「ABC」や「あいう」、「たまご」等にマッチします。また例えば、こんな使い方もできます。「あ」ではじまって「た」で終わる文字列にマッチする正規表現を考えてみましょう。簡単です。
あ.たと書けばいいのです。これなら、「あした」・「あなた」・「あAた」・「あ1た」等にマッチします。

\w

\wはアルファベット、数字、「_(アンダースコア)」にマッチします。

例えば、\w\w\wは「pen」や「12A」、「_R_」にマッチします。

\W(ダブリューが大文字!)

\W\wの反対です。すなわち英数字と「_」以外にマッチします。例えば\W\W\Wは「!!!」にマッチします。

\s

空白文字1文字を表します。ここでいう空白文字とは半角スペースだけではなく、改ページ、改行、復帰、タブにもマッチします。\sの正反対の動きをするのが、\Sです。

改ページ、改行、復帰、タブを表す個別のメタキャラクターもあります。

意味 メタキャラクタ
改ページ \f
改行 \n
復帰 \r
タブ \t

\d

「0123456789」のうち数字1文字にマッチします。例えば2桁の数字は\d\dと表します。これは5699などあらゆる2桁の数字にマッチします。

\D\dとは逆のメタキャラクタです。数字以外の1文字にマッチします。

「^」と「$」

^は行頭を表します。文字そのものを表すわけではありません。^あとすれば、「あ」ではじまる全ての文字列にマッチします。

反対に$は行末を意味します。これも文字そのものではありません。例えば、です。$とすると行末が「です。」で終わる全ての文字列にマッチします。

\b

単語境界の空文字を表します。ちょっと理解しにくいメタキャラクターですね。単語境界はディスプレイ上には表示されない概念的な区切りのことです。例えば、apple\bappleには一致しますが、applesには一致しません。文字「e」と文字「s」の間に、単語境界の空文字がないためです。尚、動作環境によっては\bではなく\yが用いられることがあります。

*

*は直前に置かれている文字のゼロ回以上の繰り返しを表すメタキャラクターです。例を見れば簡単ですよ。例えばa*aaaaaaaaaaaaaaaaaaにマッチします。0回以上の繰り返しなので、例えばlo*velveともマッチします。この場合、「o」がありませんが、これが0回の繰り返しです。もちろん、lovelooveともマッチします。

+

+は直前に置かれている文字の1回以上の繰り返しを表します。0回の繰り返しは含まない点が*とは異なりますね。例えば、a+aaaaaaaaaaaにマッチします。また、例えば、japa+njapanjapaaaaaanにマッチしますが、0回の繰り返しには対応していないので、japnにはマッチしません。ここでもし、japa*nとすると、0回の繰り返しにも対応しているので、japnにもマッチします。

{a}

メタキャラクタ 意味
{a} 直前の要素をa回だけ繰り返す
{a,} 直前の要素をa回以上繰り返す
{a,b} 直前の要素をa回以上b回まで繰り返す

例えば、A{2,4}は、AA, AAA, AAAAにマッチします。AAAAAAAAにはマッチしません。

?

直前の要素の0回または1回の出現を表します。

例えば、Apples?AppleApplesの両方にマッチします。前者が直前の要素「s」の0回の出現を表します。後者は直前の要素「s」の1回の出現を表してしますね。

[]

文字クラスを表します。[]の中に入れられた文字のいずれか1文字にマッチします。例えば[AB]ABのいずれかにマッチします。また、例えば、[ABCDE][A-E]と書いても全く同じ意味です。

但し文字コードの小さい方を前に、大きい方を後ろにしなければならないので、[E-A]とか[9-0]と書くのは誤りです。また例えば、[^A]と書くと文字クラスの否定を表し、A以外の文字と一致します。例えば[^0-9]と書くと数字以外の1文字とマッチします。

|

|の前後に記述した正規表現のどちらか一方に一致します。例えばorange|appleと書くと、orangeまたはappleにマッチします。また、()を利用して、(本日は晴天なり|本日は雨天なり)明日は晴れるといいなとすると、本日は晴天なり明日は晴れるといいな本日は雨天なり明日は晴れるといいなの2つにマッチします。

()と\1

()は上述の例でみたように、「範囲制限」の機能以外に「正規表現に一致した文字列を別のメタキャラクタに保存する」という機能があります。「なんのこっちゃ?」と思われるかもしれませんが例を見れば分かりやすいと思います。

例えば(a|b)とした場合、\1aまたはbが格納されます。

例えば(apple|banana)私の好きな果物は\1とした場合、次の2つの文字列とマッチします。

  • apple私の好きな果物はapple
  • banana私の好きな果物はbanana

このような機能を後方参照と呼びます。

 

さてさて、これで少し退屈な各メタキャラクタの解説は終わりです。ここからは実践編です。今まで習ったメタキャラクタを自由自在に組み合わせてより実践的な正規表現を学びましょう!

実践的な正規表現

まずは肩慣らしに簡単な正規表現を利用しよう

まずはウォーミングアップです。一番シンプルな正規表現である「.」を使って実践的な例を見てみましょう。

こ….!とするこで、こんにちは!こんばんわ!にマッチします。

処理系によっては日本語を1文字表すのに..とドットを2個使う場合もあります。

lean