正規表現: 文字クラス [ ] 内でエスケープしなくてもよい記号

こんにちは、hachi8833です。久しぶりに正規表現についての記事を書いてみました。 一応Ruby(Onigmo)を対象にしましたが、なるべく一般的になるようにしています。エッジケースを扱っているためにシンタックスハイライトがついていけてない部分がありますのでご了承ください。 文字クラス[ ]内のエスケープ 正規表現でのエスケープ、特に記号のエスケープは何かと面倒になりがちです。記号が出てくるたびに片っ端からバックスラッシュ\でエスケープしてばかりだと疲れてしまいます。 しかしつい忘れがちですが、正規表現の中でも文字クラス[ ]の中だけは別世界になっていて、文字クラスの外よりもエスケープが少なくてすみます。 あくまで原則としてですが、文字クラス[ ]の中に限り、以下の4つの記号だけがメタキャラクタ(=機能を持つ記号)として扱われます。 マイナスハイフン – 山形記号 ^ 閉じ角かっこ ] バックスラッシュ \ ということは、それ以外の記号はエスケープなしで楽々と文字クラス[ ]内に置けることになります。本当に?本当に? 文字クラス内メタキャラクタにも種類がある ただし、上の中でバックスラッシュ\と他の3つのメタキャラクタは挙動が異なります。 バックスラッシュ\だけは絶対的なメタキャラクタであり、自分自身を含む直後の文字は何でもエスケープします。 逆に、マイナスハイフン: -、山形記号: ^、閉じ角かっこ: ]の3つは、文字クラス[ ]内では相対的なメタキャラクタです。 具体的には、文字クラス[ ]の中に置く位置によって挙動が異なります。 文字クラス[ ]内の山形記号^ 文字クラス[ ]内の先頭が山形記号^だと、文字クラスの否定を表します(Rubularの実行例)。 [^0-9a-zA-Z] 上のようにすると、「英数字以外のあらゆる文字」を表します。これはよく使われるのでご存じの方も多いと思います。 実は、^は文字クラスの先頭以外の場所に置くのであればエスケープ不要です(Rubularの実行例)。 [0-9a-z^A-Z] 正確に言うと、先頭以外の場所であればエスケープしてもしなくて同じです。 文字クラス[ ]内のマイナスハイフン – 文字クラス[ ]内のマイナスハイフン-は、範囲を表すメタキャラクタです。 [a-zA-Z] [a-zA-Z]とすると、小文字のaからzと、大文字のAからZの文字を表します。これもよく使われるのでご存じの方が多いと思います。 文字クラス[ ]内でマイナスハイフン自体を表すには、\^のようにバックスラッシュでエスケープする方法のほかに、以下のように文字クラスの冒頭または末尾に置くことでもできます(Rubularの実行例)。 [a-zA-Z\-] [-a-zA-Z] 上の文字クラスは、どちらもマイナスハイフンと、小文字のaからzと、大文字のAからZの文字を表します。ここでも文字クラスの冒頭が特別扱いされています。 文字クラス[ ]内の閉じ角かっこ ] 次がやや気色悪いです。 文字クラス[ … Continue reading 正規表現: 文字クラス [ ] 内でエスケープしなくてもよい記号