正規表現、正則表現(英:Regular Expression)とは、文字列の集合を表すための表現法である。形式言語理論の分野では正則表現、電算機上での文字列処理では正規表現と呼ばれる事が多い。
概要
正規表現を用いると、一定の規則に従った文字列の集合を一つの文字列で表現することができる。例えば、「Aから始まりZで終わる、アルファベットからなる10文字の文字列」の集合は、 A[a-zA-Z]{8}Z という風に表現できる。これを検索条件として指定すれば、ワイルドカードを使用するよりも詳細な検索が行える。
正規表現は文字列検索をするのに大変便利なツールだが、言語間・環境間の方言が非常に多いので、利用する際は注意が必要である。多くの言語・環境に搭載されている正規表現はPerl互換だが、特定の文字クラスが存在しなかったり、メタ文字の意味が違ったりしていることがあるのが事態を厄介にしている。なお、一部の記法は本来の正規表現の範囲から外れていることがある。
主な正規表現の例
- . - 任意の1文字にマッチする。
例:a.c → abc, aac, aあc, ... などにマッチ - [] - 括弧内に含まれる文字にマッチする。
例: [aAbB] → a, A, b, B にマッチ。
括弧内に「-」が含まれている場合、その前後の文字と、間の文字にマッチする。
例: [a-z] → a, b, c, ..., z にマッチ。 [a-cf-j] → a, b, c, f, g, h, i, j にマッチ。 - [^] - 括弧内に含まれない文字にマッチする。括弧内の「-」の扱いは[]と同じ。
例: [^a-z] → A, B, C, あ, い, う, ... などにマッチ - * - 直前の文字の0回以上の繰り返しにマッチ。
例: aab* → aa, aab, aabb, aabbb, ... などにマッチ - + - 直前の文字の1回以上の繰り返しにマッチ。
例: aab+ → aab, aabb, aabbbb, ... などにマッチ - ? - 直前の文字の0回、または1回の登場にマッチ。
例: aa? → a, aa にマッチ - () - 括弧内をグループ化する。
例: (ab)*c → c, abc, ababc, abababc, ... などにマッチ
使ってみよう
表記のブレを吸収する
モデルケースとして、「好きなアニメのキャラクターへの投票をコメント欄で受け付ける」というものを考える。この時、ユーザーは思い思いのキャラクター名をコメントしていくわけだが、そこは人間が手打ちしたものなので、若干の表記ブレが混じってしまう。例えば、以下は全て同じキャラクターへの投票である。
これを普通に数えようとすると、一度各表記ごとに集計し、各表記ごとの投票数を合計する、というアプローチを取る。
が、これは非常に面倒くさい。可能であればメジャーな表記ブレの集計については一発でまとめてしまいたい。そこで使うのが正規表現である。
((キュ|きゅ)[ウゥうぅ](べえ|ベエ)|QB)
これで大まかには表記ブレを拾うことができる。誤字脱字などについては拾いきれないが、大した数ではないだろうから、後で適宜対応すればよい。もし意外と数が多いのなら、正規表現を少しいじってあげればよい。
なお、うまくマッチする正規表現は上記の例以外にもいくらでも考えられる。よりスマートな表現がないか考えてほしい。
特定のフォーマットのテキストを別のフォーマットに変換する
泥臭い仕事をするシステムエンジニアにありがちなケースを挙げる。プログラムの中で用いる大量のエラーメッセージの定義が、以下のような表でまとめられている。
通し番号 | ID | メッセージ |
---|---|---|
1 | ERR_NANTOKA | hoge error |
2 | ERR_KANTOKA | piyo error |
3 | ERR_UNTARA | huga error |
4 | ERR_KANTARA | foo error |
5 | ERR_KAKUKAKU | bar error |
6 | ERR_SHIKAZIKA | baz error |
このような内容が数百項目あるのだが、これを全てプログラムの定数値に直さなければならない。しかし、数百項目を手作業で変換するのは面倒だし、何より絶対にどこかで間違いが発生する。そこで、正規表現を使って一括で置換するわけである。
置換文字列: public static final String \1 = "\2"
表の内容をテキストエディタに貼り付け、上記の置換をかけてやると一発で変換が終了する。Excel上で文字列結合をするアプローチでもいいのだが、その辺りは趣味の問題である。
関連動画
関連商品
関連項目
- ワイルドカード
- プログラミング関連用語の一覧
- UNIX
- Perl - hogeを検索する場合、「~/hoge/」とする
- grep - hogeを検索する場合、「'hoge'」とする
- JavaScript - Perlと同様。
- HTML - HTML5の規格に規定されている
外部LINK
- regexper
- 正規表現を視覚化するサイト
- イレギュラー・エクスプレッション
- 本物の正規表現使いの話
- 6
- 0pt