はじめに
正規表現というと、とっつきにくいイメージがあるかなと思います。
しかし、一度身につけてしまえば色々な文字列に関する作業を効率化できるようになります。
今努力して正規表現を身につけて将来の効率化を目指すか、頑張らないで非効率なまま過ごしていくか。
今回は、正規表現初心者のために7つの問題を解くことによって、脱初心者になるための記事です。
記事の最後には、正規表現はや見表をつけています。
正規表現とは
正規表現とは簡単に言うと、いくつかの文字列を一つの形式で表現するための表現方法です。
では、どんなものに使えるのでしょうか?
よく使われる例として、電話番号があります。
郵便番号:123-4567
電話:03-1234-5678
内線:555
というようなテキストがあった時に、電話番号だけを抜き出したいとします。
この程度なら頑張ればプログラムを書くこともできますが、苦労しますよね。
正規表現を使った場合、
\d\d-\d\d\d\d-\d\d\d\d
これだけで、パターンマッチすることができます。
どうでしょう。効率的ですよね?
これから、"\d"などの解説をしていきます。
一文字にマッチング
一文字にマッチングする代表的なものを以下に並べます。
記号 | 意味 |
---|---|
\d | 0~9の数字 |
\D | 数字以外の文字 |
\s | 空白文字・タブ・改行 |
\S | 空白文字・タブ・改行 以外の文字 |
\w | アルファベット・数字・アンダースコア |
\W | アルファベット・数字・アンダースコア 以外 |
郵便番号:123-4567
電話:03-1234-5678
内線:555
問題1
textの中から、四つの文字からなる単語にマッチする正規表現を書け。
次の問題の下に、前の問題の答えが書いてあります。
メタ文字
記号 | 意味 |
---|---|
. | 任意の一文字 |
[] | []内のいずれかの文字 |
? | 0回か1回の繰り返し |
+ | 1回以上の繰り返し |
* | 0回以上の繰り返し |
{m,n} | 最小m回で最大n回 |
^ | 文字列の先頭 |
$ | 文字列の末尾 |
任意の一文字にマッチ
任意の一文字を表すのは「.」(ピリオド)
正規表現:a.
例文:abcde
マッチする文字:ab
問題2
上記の例文で正規表現を「c.」とすると、マッチする文字は何か?
\D\D\D\D
どれか一文字にマッチ
どれか一文字にマッチさせるには「[]」で囲む。
正規表現:[Tt]his
マッチする文字:This or this
例えば、abc bbc cbc・・・というような文字列をマッチしたい時、
[abcdefghijklm・・・]bc
という様に打つのは面倒くさいですよね。
その代わりに、[a-z]と打てば、小文字アルファベットに対応できます。
さらに、アルファベットすべてに対応したかったら、[A-z]と書けばOKです。
問題3
a-0 or b-1 or c-2 or d-3 ・・・ z-25
のいずれの文字が文章中に出現する。
これらにマッチする正規表現を書け。
cd
1回以上の繰り返しと、0回以上の繰り返し
1回以上の繰り返しは「+」、0回以上の繰り返しは「*」で表します。
正規表現:.*
意味:任意の文字が0回以上続く
マッチする文字:空文字、a、aa、0123
正規表現:[0-9A-z]+
意味:半角英数字が1文字以上続く
マッチする文字:a、aaa、0c1c2c3
メタ文字へのマッチ
メタ文字へマッチさせるには、「\メタ文字」とします。
正規表現:\.
マッチする文字:.
パターンが連続する回数を指定する
記号 | 意味 |
---|---|
{n} | 直前のパターンがn回続く |
{n,} | 直前のパターンがn回以上続く |
{n,m} | 直前のパターンがn回以上m回以下続く |
郵便番号:123-4567
電話:03-1234-5678
内線:555
問題4
textの中から、郵便番号にマッチする正規表現を書け。
[a-z]-\d{1,2}
0回か1回の繰り返し
0回か1回の繰り返しは「?」で表します。
例えば、appleかapplesをマッチしたい時は、apples?とすると、直前の文字の0回か1回の繰り返しとなり、apple or applesに対応します。
問題5
httpかhttpsで始まるURLにマッチする正規表現を書け。
\d{3}-\d{4}
行の先頭か最後とマッチ
行の先頭は「^」、行の最後は「$」です。
複数パターンへのマッチ
複数パターンのいずれかにマッチしたい時は、「|」で区切る。
プログラミングでいうorと一緒。
(this|that) これで、this or thatにマッチする。
問題6
This is a pen.
this is a pen.
That is a pen.
that is a pen.
上記の文章のいずれかの文が与えられた時に、文頭のThis,this,That,thatにきちんとマッチする正規表現を書け。
https?//[0-9A-z\.]+
[]内で否定したい時
正規表現:ABC[^a-z]
意味:ABCとa~z以外のすべての文字
マッチする文字:ABCD, ABCZ
問題7 応用問題
メールアドレスにマッチする正規表現を書け。
([Tt]his|[Tt]hat)
正規表現 はや見表
1文字にマッチングする特殊文字
記号 | 意味 |
---|---|
\d | 0~9の数字 |
\D | 数字以外の文字 |
\s | 空白文字・タブ・改行 |
\S | 空白文字以外の文字 |
\w | アルファベット・数字・アンダースコア |
\W | アルファベット・数字・アンダースコア 以外 |
\t | たぶ |
\r | リターン |
\n | 改行 |
\○○○ | 8進数の○○○で表される文字 |
\x○○ | 16進数の○○で表される文字 |
メタ文字
記号 | 意味 |
---|---|
? | 0回か1回の繰り返し |
+ | 1回以上の繰り返し |
* | 0回以上の繰り返し |
{m,n} | 最小m回で最大n回 |
^ | 文字列の先頭 |
$ | 文字列の末尾 |
. | 任意の一文字 |
[] | []内のいずれかの文字 |
※ 自分も初心者なので、間違え等ありましたらご連絡お願い致します。
[\w.\-]+@[\w\-]+\.[\w.\-]+