第10回デザイナーと学ぶプログラミング@正規表現その1

こんにちは!水は一日2L飲むように心がけている橋浦です!
 
とうとうデザイナーと学ぶプログラミングも10回目となってしまいました…。当初は数回だけの予定だったのに!
しかし、それだけ自分もパワーアップしていると信じて今後も記事を書いていきたいと思います…!
さて、今回は『正規表現』について学んでいきましょう!

正規表現とは?

正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。正則表現(せいそくひょうげん)とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。まれに正規式と呼ばれることもある。(Wikipediaより引用)
例を挙げると、
携帯電話の番号は「XXX-XXXX-XXXX」といった形式が基本ですよね。
x部分の数字は変われど、この形式は変わらない場合が多いかと思われます。
乱暴に言ってしまえば、この「XXX-XXXX-XXXX」も携帯電話番号を表している正規表現と言ってしまえます。
 
しかし、このままプログラムに書いても勿論動きません。
プログラム的に携帯電話番号を正規表現で表すとするなら、以下のようになります。

「¥」やら「^」やらが突然出て来て何が何やら…といった感じですが、これらをこれから説明していきたいと思います!
 

正規表現で頻出する特殊文字(メタキャラクタ)

上の携帯電話の正規表現の中で突然出て来た「¥」や「^」。
これらはただのアスキーアートのパーツではありません!!!(当たり前)
これらの特殊文字には一つ一つ意味があるのです。
それらをざっと紹介したいと思います。
ちなみに、正規表現では特殊文字を『メタキャラクタ』といいます。
 

主な特殊文字一覧

 $ :入力文字列の末尾と一致します。RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は ‘\n’ または ‘\r’ の直前にも一致します。$ と一致させる場合は \$ と指定します。
 ( ) :サブ式の開始と終了を指定します。サブ式は記憶され、後で使用することができます。かっこと一致させる場合は、\( および \) と指定します。
 * :直前のサブ式と 0 回以上一致します。* と一致させる場合は \* と指定します。
 + :直前のサブ式と 1 回以上一致します。+ と一致させる場合は \+ と指定します。
 . :改行文字 \n 以外の 1 文字と一致します。. と一致させる場合は \ と指定します。
 [ :角かっこの式の開始を指定します。[ と一致させる場合は \[ と指定します。
 ? :直前のサブ式と 0 回または 1 回一致するか、パターン制限修飾子を意味します。? と一致させる場合は \? と指定します。
 ¥ :次に続く文字が特殊文字、リテラル、後方参照、または 8 進エスケープであることを示します。たとえば、”n” は文字 “n” と一致します。’\n’ は改行文字と一致します。”\\” は “\” と、”\(” は “(” と一致します。
 ^ :入力文字列の先頭と一致します。かっこの中で使用した場合は、かっこ内の文字セットを否定します。^ と一致させる場合は \^ と指定します。
 { :修飾子の式の開始を指定します。{ と一致させる場合は \{ と指定します。
 | :2 つの項目から選択します。| と一致させる場合は \| と指定します。
 
それぞれの文末についている、「○と一致させる場合は\○と指定します」というのは、メタキャラクタになっている記号自体を一致させる場合、ということです。
また、整数との組み合わせなどを加えると、メタキャラクタはもっと沢山あります。
メタキャラクタは正規表現を読み解く上では不可欠な要素です。多いですが覚えてしまいましょう!
 

例を挙げて説明してみる

では、例を挙げて正規表現はどういう構造なのか見ていきましょう!
折角なので最初に挙げた携帯番号を例にしてみます。

 
正規表現は算術式と同じく、左から右に評価されます!
ということで左から見ていきましょう。
 
まずは、先頭についた
・^と$
これは一つ一つの意味は上記の一覧を見て頂ければわかりますが、二つ同時に用いた時は
「この内容の行に合致する」という意味になります。
^と$の間に挟んでいる内容が必ずなければいけないという状態です。
 
では次に文章中の
・¥d{3}
¥dは任意の10進文字を表します。0-9の数字ですね。
次に、{}で囲まれた数字は、○回一致するという意味です。今回は3なので3回一致する、ということを表しています。
先程の¥dの説明と合わせると、
任意の0-9の数字が3つ(3回)一致するという意味になります。
 
つまり、¥d{3}は「XXX-XXXX-XXXX」の冒頭3文字のXXXを表しています。
 
-(ハイフン)はそのまんま電話番号の区切りの-ですね。
 
その後の¥d{4}も勿論XXXXを表しています。
なので、XXX-XXXX-XXXX = ^¥d{3}-¥d{4}-¥d{4}$となります。
 
その次の|は上の一覧でもありますが「もしくは」という意味です。なので、

を文章にすると、
全てが数字の3桁-4桁-4桁の文字列又は11桁の文字列となります。
 

今回はここまで

ちょっと長くなってしまったので一回切りたいと思います。
次回は更に例を挙げて、まだ紹介しきれていない部分をもう少し紹介したいと思います。
では、次回もぜひお付き合い頂ければ幸いです!!
 

参考サイト(敬称略)

Microsoft Developer Network
【なかま】’s HP サルにもわかる正規表現入門