イメージで感じて覚える正規表現 その1
1 Comments
ひらくん
正規表現についてよく質問されるもので次のようなものがあります。
「文字クラスの中のメタ文字ってエスケープ必要なんですか?」
答は不要。でもそれだけじゃあつまらないですね。では今回はもうちょっと踏み込んで文字クラスのイメージを考えてみましょう。
前回は、正規表現を表す最小パターンは一文字を表現する文字クラスということをご説明させていただきました。さらに一歩踏み込んで理解を深めてみましょう。よく、
「メタ文字であるピリオドをマッチさせるためにはバックスラッシュでエスケープしましょう」
という説明があります。では「[ ]」の中で使うピリオドはどうでしょうか? 「[ ]」の中でピリオドを指定する場合、バックスラッシュによるエスケープは必要ありません。なぜなら「[ ]」は文字クラスであり、それ全体で1文字を表すものです。その内側に「全ての文字を表す文字クラス」があっては、
「[ ]」の存在意義が根底から覆ってしまいます!
そのような矛盾が生じてしまうのでピリオドは「[ ]」の中ではただの文字として認識されます。同様なものにマッチした文字列をキャプチャする「( )」がありますね。文字をキャプチャするはずの「( )」が一文字を表す文字クラスの内側にあっても、
「おいおい、あんた何をキャプチャするつもりだい?」
ということで「()」もただの文字として認識されます。量指定子である「+」も基本的には「直前の文字クラスの繰り返し」ですから文字クラスの内側に入った場合はメタ文字として意味をなさなくなり、ただの文字として認識されます。
このように、一文字を表す文字クラスを意識して考えると、
「あー、そもそも何らかの文字の繰り返しや範囲を指定してるのに、一文字を表す指定の内側に入ったら意味無いよね」
ということがイメージ出来るのではではないでしょうか。
「文字クラスの中のメタ文字ってエスケープ必要なんですか?」
答は不要。でもそれだけじゃあつまらないですね。では今回はもうちょっと踏み込んで文字クラスのイメージを考えてみましょう。
前回は、正規表現を表す最小パターンは一文字を表現する文字クラスということをご説明させていただきました。さらに一歩踏み込んで理解を深めてみましょう。よく、
「メタ文字であるピリオドをマッチさせるためにはバックスラッシュでエスケープしましょう」
という説明があります。では「[ ]」の中で使うピリオドはどうでしょうか? 「[ ]」の中でピリオドを指定する場合、バックスラッシュによるエスケープは必要ありません。なぜなら「[ ]」は文字クラスであり、それ全体で1文字を表すものです。その内側に「全ての文字を表す文字クラス」があっては、
「[ ]」の存在意義が根底から覆ってしまいます!
そのような矛盾が生じてしまうのでピリオドは「[ ]」の中ではただの文字として認識されます。同様なものにマッチした文字列をキャプチャする「( )」がありますね。文字をキャプチャするはずの「( )」が一文字を表す文字クラスの内側にあっても、
「おいおい、あんた何をキャプチャするつもりだい?」
ということで「()」もただの文字として認識されます。量指定子である「+」も基本的には「直前の文字クラスの繰り返し」ですから文字クラスの内側に入った場合はメタ文字として意味をなさなくなり、ただの文字として認識されます。
このように、一文字を表す文字クラスを意識して考えると、
「あー、そもそも何らかの文字の繰り返しや範囲を指定してるのに、一文字を表す指定の内側に入ったら意味無いよね」
ということがイメージ出来るのではではないでしょうか。