またしても間が空いてしまった。
今回は正規表現だ。タイトルに「文字クラス」と書いたが、これが前回の最後に告知した大括弧で囲むもの。
これが使えると、大体のものが簡単に表せるようになる。
また、そろそろ具体的な例も充実してお見せできてくるだろう。
理解の一助になれば幸いだ。
前回の復習
前回は、行の先頭を表す^
と、行の末尾を表す$
を扱った。
これを使えば、その行がどんな条件か、というものを抽出できるようになる。
…ただ、先頭を表す^
については、今回別の意味を持って出てくる。
違いをしっかり意識しておこう。
文字クラス
文字クラスとは
文字クラスとは、「ある文字の塊」の集合を表しているもの。
正規表現内では、そのうちいずれか1つの塊を表すことができる。
…こう書くと、以前にも同じようなものをやったと思う。
そう、バーティカルバーというやつ(|
)だ。
以前は、以下のような例を出した。
(s|ex)ample
こうすると、最初にs
もしくはex
で、その次にample
が来る文字列…つまり、sample
かexample
を表すことができた。
この、s
だったりex
だったりが、文字の塊だ。
上の例は選択肢が二つだけだったのでまだよかったが、これが例えば英小文字1文字だったら、以下のようになってしまう。
(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)
…面倒だ。全部羅列するのもそうだが、いちいち縦棒を挟むのが特につらい。
というわけで、こんなことをしなくてもいいように、文字クラスを使っていこう。
文字クラス使用方法
文字クラスは大括弧、[
と]
で囲む。
その中にそのまま文字列を入れると、その文字列のいずれかの1文字を表すことができる。
これで、アルファベットなら以下のように表せるわけだ。
[abcdefghijklmnopqrstuvwxyz]
…多少楽にはなったが、まだ面倒だ。もっといい方法はないものか。
と書いている時点で想像できると思うのだが、いい方法はある。
この文字クラスの中で、英大文字、英小文字、数字に関して範囲指定を行うことができる。
範囲の小さいものと大きいものをハイフンで区切ることで、それが表現できるのだ。
これを使うと、任意の英小文字一文字は最終的に以下のようになる。
[a-z]
かなりスッキリした。これで文句ないだろう。
このように、明示的にこのいずれか、という表し方ができるのだが、実はもう一つできることがある。
「この文字以外」という書き方だ。このとき、文字クラスの大括弧内の先頭に^
をつける。
例えば、数字以外だったら何でもいい場合。
[^0-9]
こうなる。^
をつけると、その文字クラスに現れる塊以外のものを表すことができる。
これができるようになると、例えば数字以外が3文字続くようなものを表現したい時は…
[^0-9][^0-9][^0-9]
こんな風に書けるのだ。
補足:小括弧について
ここで一個補足をしておこう。
第0回で、小括弧は選択肢全体を囲み、その選択肢の結果いずれかの一つを表すと書いた。
それもそうなのだが、そもそも小括弧には、その中身を一つの塊とする意味がある。
第0回の場合は、選択肢で囲った結果を一つの塊としていたのだ。
どういうことかというと、最初に出した例を今回のものに置き換えてみればわかる。
というわけで、最初に出した例を、この文字クラスでの表現に変更してみよう。
[s(ex)]ample
こうすることで、文字クラスの部分はs
とex
という2つの塊いずれか、という意味になる。
このあたりも覚えておくと、更に楽な書き方ができるようになるだろう。
今回までの内容で使える例
今回までの内容で、例えばパスワードを受け付ける際のチェック用表現を書くことができる。
条件として、使える文字は以下のいずれかとしよう。
- 英語大文字
- 英語小文字
- 数字
これで、1文字以上の文字列としてみる。すると、正規表現の1例は以下のようになる。
^[A-Za-z0-9]+$
これで、テキストに以下の内容を書いてみて、どの行がマッチするか見てみよう。
password
Password
passw0rd
Passw0rd
PASSWORD
PASSW0RD
ぱすわーど
ぱすわーどa
ぱすわーどA
ぱすわーど1
1行目から6行目までがマッチすればOK。
ちょっと詳しく見てみよう。
まず、文字クラスの中にA-Za-z0-9
とある。
上で解説したように、ハイフンで囲むとその範囲のいずれか1文字になる。
つまり、それが一つの塊となる。この部分で、AからZまでの1文字、aからzまでの1文字、0から9までの1文字があるわけだ。
それを、文字クラスに入れている。上の3つの塊いずれか1文字が来るわけだ。
そして、最後に+
がついている。これは、直前のものを1回以上繰り返す。
よって、「英大文字、英小文字、数字のいずれか」という塊が1回以上繰り返されているもの、となる。
ここまでで、それが行に含まれているもの、という抽出条件。
最後に、先頭の^
と末尾の$
。このおかげで、まず先頭に上で書いた内容が来て、それが終わったら行の終了だ、という意味になる。
これで、最終的にそれらだけで構成される行を抽出できるようになる、というわけだ。
まとめ:文字クラス
今回は、文字クラスというものを扱った。
- 大括弧で文字の塊を囲むと、その塊いずれかを表す。
- 英文字、数字はハイフンで範囲選択が可能。その範囲のいずれか1文字を表す。
- 英大文字全部:
A-Z
- 英小文字全部:
a-z
- 数字全部:
0-9
- 英大文字全部:
- 大括弧内の先頭に
^
をつけると、その文字クラス以外の文字を表す。
一旦、このあたりまででもだいぶ実用的になる。が、もうちょっと使いやすくもできる。
例えば、指定したものを特定の回数だけ繰り返すであったり、この正規表現で使用している記号を文字列として調べるであったり。
今のままでは、例えば数字3桁を書くときには[0-9][0-9][0-9]
と、同じものを3回書かなければいけない。これがもし100桁とかになると大変だろう。
また、^
を探そうとしても上手くできない。行の先頭あるいは否定で使われる文字だからだ。
次回は、このあたりを解説しよう。
更新情報はTwitterでも呟いている。よかったら、ページ下部のTwitterアイコンから覗いていってほしい。
それでは。
コメント