昨日更新してこちらのモチベーションが上がってきた。
今回は、正規表現講座だ。前回の予告通り、指定回数だけ繰り返しを行うものと、特殊な文字を探す方法を解説する。
ここまでで、ほとんどの文字列を表現することが可能だ。
最後の一踏ん張り、是非習得して欲しい。
前回の復習
前回は、文字クラスというものについて解説した。文字クラスとは、ある文字の塊のいずれか一つを表すものだ。
まとめで載せた内容を再掲しておこう。
- 大括弧で文字の塊を囲むと、その塊いずれかを表す。
- 英文字、数字はハイフンで範囲選択が可能。その範囲のいずれか1文字を表す。
- 英大文字全部:
A-Z
- 英小文字全部:
a-z
- 数字全部:
0-9
- 英大文字全部:
- 大括弧内の先頭に
^
をつけると、その文字クラス以外の文字を表す。
これは、今回の内容と組み合わせることで更に強い効力を発揮する。
まずは一つ一つの内容をしっかり身に付けていこう。
繰り返し回数
さて、今回の内容だ。まずは繰り返し回数について。
これまでできたこと
まずはこれまでどんなことができていたか、確認しておこう。
まずは、そのまま書くと、それが1回あることを表していた。以下は、abc
という文字列が1回の部分に該当する。
abc
次に、以下のように書くと、abc
の後にd
が0回以上続くものを表した。
abcd*
で、この*
を+
にすると、0回以上が1回以上になった。
abcd+
このように、これまでは1回、0回以上、1回以上が表せていたわけだ。
指定回数だけ繰り返す
まずは、ピンポイントでこの回数だけ、というものを指定してみよう。
このときは、*
や+
を置いていた箇所に、中括弧{
と}
で囲んだ数字を書いてあげる。
そうすることで、その数字の回数だけ繰り返す、というものが表せる。
例えば、数字7桁であれば、以下のような形。
[0-9]{7}
まず、前半の大括弧部分。これは、前回解説した文字クラスだ。
中身が0-9
となっているので、数字ならどれでもいいのでとりあえず1文字を表す。
で、次についている{7}
の部分。これで、直前の塊がちょうど7回繰り返す、という表現になる。
では、ここで一つクイズ。以下のファイルを上の正規表現で探すと、どうなるだろうか?
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789
これをSample.txtに保存して、その場所で以下のコマンドを実行したとしよう。
Select-String -Pattern '[0-9]{7}' Sample.txt
さあ、どうなるだろうか。
正解は、以下の通りだ。
Select-String -Pattern '[0-9]{7}' Sample.txt
出力結果
Sample.txt:7:0123456
Sample.txt:8:01234567
Sample.txt:9:012345678
Sample.txt:10:0123456789
そう、7文字以上が抜き出してしまっている。なぜだか分かるだろうか。
これは、あくまで連続した数字7桁が含まれている行を探してきてしまっているからだ。
つまり、7行目以降では、先頭から0123456
という7桁の数字が入っているため、全部が該当してしまっている。
これを無くすためには、行の先頭^
・末尾$
を入れてあげよう。
Select-String -Pattern '^[0-9]{7}$' Sample.txt
出力結果
Sample.txt:7:0123456
これで、ちょうど7桁の行だけ抜き出せた。
指定回数以上、以下を繰り返す
さて、ピンポイントで探したい繰り返し回数が分かっていれば上だけで十分だが、そう甘くもない。
とりあえず最低〇文字、最大〇文字は分かっているとしよう。もちろん、これも表せる。
上で書いた中括弧を、コンマで二つのブロックに分ける。
で、前半に最小回数、後半に最大回数を入れてあげると、それぞれの数字を含む回数の範囲で探すことができる。
例えば、3桁以上6桁以下の数字の場合は、以下の通り。
[0-9]{3,6}
これに行の先頭・末尾を加えて先ほどのSample.txtから探してみると…
Select-String -Pattern '^[0-9]{3,6}$' Sample.txt
出力結果
Sample.txt:3:012
Sample.txt:4:0123
Sample.txt:5:01234
Sample.txt:6:012345
このように抜き出せる。
なお、中括弧の後半部分、最大文字数を空欄にすると、単に〇回以上というものを表せるようになる。
Select-String -Pattern '^[0-9]{7,}$' Sample.txt
出力結果
Sample.txt:7:0123456
Sample.txt:8:01234567
Sample.txt:9:012345678
Sample.txt:10:0123456789
こんな感じだ。
0回、もしくは1回
これもあった方が便利だろう。
これについては、後ろに?
をつければOK。
abcd?
これで、abc
と続いて、後ろにd
が0回、もしくは1回続くパターンにすることができる。
特殊文字
エスケープ処理とは
この正規表現では、特定の文字を特殊な意味を持つものとして扱っている。
例えば、文字を一つの塊と見なす小括弧、例えば行の先頭を表す^
と末尾を表す$
、などなど。
繰り返しを表す*
、+
もそうだ。
で、じゃあこれらの文字自体を探すためにはどうすればいいのか、という問題が出てくる。
例えば、+
という文字が入った行を抜き出したい場合。
これには、特殊な文字を通常の文字として扱うために、エスケープ処理というものをしてあげる必要がある。
特殊な意味を逃がし(escape)、普通の文字として処理してもらうのだ。だから、エスケープ処理。
エスケープ処理の書き方
やることは簡単で、その文字の直前に、半角¥マーク、あるいはバックスラッシュを入れてあげる。これらは、環境によってどちらが表示されるか異なる。
なので、+
が入った行を探すには、
\+
としてあげればいい。
ちなみにだが、この\
を探すためにはどうすればいいか。これも同じく、一個前にもう一度\
を入れてあげる。
\\
これでOKだ。
ここまでの内容でできる具体例
さあ、ここまででかなりのことができるようになる。
例として、電話番号を見てみる。特に、携帯番号を表したいとしよう。
通常、携帯番号は数字3桁ハイフン数字4桁ハイフン数字4桁と書く。例えば、090-1234-5678といった感じ。
また、国番号を付けた場合は、先頭の数字3桁の部分が、プラス記号数字2桁ハイフン数字2桁となる。+81-90-1234-5678のような感じだ。
これを、正規表現で表してみよう。
まず、先頭の部分。数字3桁もしくはプラスから始まる部分。
([0-9]{3}|\+[0-9]{2}-[0-9]{2})
これで先頭部分になる。で、その後ろのハイフン以降は以下の通り。
-[0-9]{4}-[0-9]{4}
これをくっつけて…
([0-9]{3}|\+[0-9]{2}-[0-9]{2})-[0-9]{4}-[0-9]{4}
これで、電話番号の完成だ。
試しに、以下のファイルから探してみよう。
090-1234-5678
09012345678
0901-234-5678
+81-90-1234-5678
+819012345678
Select-String -Pattern '([0-9]{3}|\+[0-9]{2}-[0-9]{2})-[0-9]{4}-[0-9]{4}' Sample.txt
出力結果
Sample.txt:1:090-1234-5678
Sample.txt:4:+81-90-1234-5678
これで、上手くハイフン付きの電話番号が抜き出せた。
まとめ:繰り返し回数と特殊文字
今回は、ある正規表現を指定回数だけ繰り返すパターン、そして特殊な文字をそのまま探したいパターンを解説した。
内容をまとめておこう。
- 繰り返し回数
- 中括弧で数字を一つ指定すると、直前のものをその回数だけ繰り返す。
- 中括弧でコンマ付きで数字を二つ指定すると、一つ目以上、二つ目以下の回数だけ繰り返す。
- 中括弧で、数字とコンマ一つだけ指定すると、その回数以上だけ繰り返す。
?
をつけると、0回か1回を表す。
- 特殊文字
- 特殊な文字を表す場合は、その直前に
\
をつける。
- 特殊な文字を表す場合は、その直前に
これで、基本的な内容は全てだ。つまり、講座自体は完結。
…とはいえ、まだ具体的な使用例がちょっと物足りない。
というわけで、次回はちょっと本格的にこれらを使って、実際に処理を行う例を解説していこう。
そこで、別で解説しているJavaScriptとの組み合わせも紹介する。
やる内容は、csvファイルをJavaScriptの配列に格納してみようと思う。
更新情報はTwitterでも呟いている。よかったら、ページ下部のTwitterアイコンから覗いていってほしい。
それでは。
コメント