正規表現のおさらい

テキスト処理をするのには欠かせない 正規表現 についておさらいしたいと思います。

コードを書く方であれば基本技術といって差し支えないほど、正規表現は強力なツールです。
ですが、コードを書かない方にとっても、正規表現は間違いなく強力なツールになります。 ぜひ簡単なところから使用してみていただきたいと思います。

そもそも正規表現とは:

正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。 https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE より

ということで、文字列のパターンをあらわすものです。
これを駆使することによって、テキストの検索が非常に便利になることがあります。
例えば、あるテキストの中から "walk in" と "walkin" を抽出したいとします。普通に検索するならば、"walk in" と "walkin" で2回検索すればよいことです。
しかし、"walk-in" も検索したくなったらどうなるでしょうか。あるいは "walking" は抽出したくないとしたらどうなるでしょうか。 単なるテキスト検索では、複数回検索する必要があったり、抽出結果をフィルタしたりする必要が出てきます。

こんなときは、正規表現の出番です。
"walkin" も "walk-in" も "walk in" もすべて1つのかたちであらわすことができるるが、正規表現です。

正規表現は、任意の文字(列)と、特別な意味を与えるメタ文字から構成されます。
メタ文字以外は、普通のテキスト検索と同じようにヒットします。"walkin" は walkin という文字列にマッチします。(正規表現では、その表現が当てはまってヒットすることをマッチするという言い方をします)

正規表現ではメタ文字を使って、主に「繰り返す回数」「AまたはB」の組み合わせで記述します。

繰り返す回数

0回か1回

0回か1回を表すのは ? (はてなマーク) です。その ? の直前にあるものが、0回または1回あらわれることを意味します。
ですから、"walk ?in" という正規表現は、? の直前にある空白が0回または1回あらわれるときにマッチするので、"walkin" にも "walk in" にもマッチします。

0回以上

0回以上をあらわすのは * (アスタリスク) です。その直前にあるものが0回以上あらわれることを意味します。
"walk   in" という文字列に対して、"walk ?in" はマッチしません。"walk ?in" では、あらわれる空白は1回までです。 一方 "walk *in" という正規表現では、"walk   in" にもマッチします。

1回以上

1回以上をあらわすのは + (プラス記号) です。その直前にあるものが1回以上あらわれることを意味します。
"walk +in" なら、"walk in" にも "walk   in" にもヒットしますが、"walkin" にはヒットしません。

AまたはB

"walk in" にも "walk-in" にもマッチさせたい場合は、| (縦棒) を使います。 " |-" とすれば、空白かハイフンかどちらかにマッチする となります。 なお、 | がどれとどれの選択なのかを指示するために、丸括弧を使って | で選択する部分をくくります。
"( |-)"
丸括弧もメタ文字であり、丸括弧でくくったものをグループ化する意味があります。

ここまでのメタ文字を使って、冒頭の "walkin" "walk in" "walk-in" にマッチする正規表現は、以下のように記述することができます。
"walk( |-)?in"
まず walk が来て、そのあと空白かハイフンが0回または1回あらわれ、そのあと in が来る ということになります。

なお上記では "walking" の "walkin" 部分にもマッチしてしまいますが、正規表現の技巧を駆使すれば "walking" にはマッチしない正規表現を記述することもできます。



いまひとつな例でしたが、これまで正規表現を使ったことがない方も、簡単な正規表現から使い始めてみることをおすすめします。
きっとテキスト操作の効率化に寄与するはずです。