LoginSignup
64
68

More than 5 years have passed since last update.

ゼロから始める正規表現 ~初心者から抜け出す珠玉の7問~

Last updated at Posted at 2016-08-09

はじめに

正規表現というと、とっつきにくいイメージがあるかなと思います。
しかし、一度身につけてしまえば色々な文字列に関する作業を効率化できるようになります。
今努力して正規表現を身につけて将来の効率化を目指すか、頑張らないで非効率なまま過ごしていくか。

今回は、正規表現初心者のために7つの問題を解くことによって、脱初心者になるための記事です。

記事の最後には、正規表現はや見表をつけています。

正規表現とは

正規表現とは簡単に言うと、いくつかの文字列を一つの形式で表現するための表現方法です。

では、どんなものに使えるのでしょうか?
よく使われる例として、電話番号があります。

text
郵便番号:123-4567
電話:03-1234-5678
内線:555

というようなテキストがあった時に、電話番号だけを抜き出したいとします。
この程度なら頑張ればプログラムを書くこともできますが、苦労しますよね。

正規表現を使った場合、

re
\d\d-\d\d\d\d-\d\d\d\d

これだけで、パターンマッチすることができます。

どうでしょう。効率的ですよね?

これから、"\d"などの解説をしていきます。

一文字にマッチング

一文字にマッチングする代表的なものを以下に並べます。

記号  意味
\d 0~9の数字
\D 数字以外の文字
\s 空白文字・タブ・改行
\S 空白文字・タブ・改行 以外の文字
\w アルファベット・数字・アンダースコア
\W アルファベット・数字・アンダースコア 以外
text
郵便番号:123-4567
電話:03-1234-5678
内線:555

問題1

textの中から、四つの文字からなる単語にマッチする正規表現を書け。

問題の答え
次の問題の下に、前の問題の答えが書いてあります。

メタ文字

記号  意味
. 任意の一文字
[] []内のいずれかの文字
? 0回か1回の繰り返し
+ 1回以上の繰り返し
* 0回以上の繰り返し
{m,n} 最小m回で最大n回
^ 文字列の先頭
$ 文字列の末尾

任意の一文字にマッチ

任意の一文字を表すのは「.」(ピリオド)

example
正規表現:a.
例文:abcde
マッチする文字:ab

問題2

上記の例文で正規表現を「c.」とすると、マッチする文字は何か?

問題1の答え
\D\D\D\D

どれか一文字にマッチ

どれか一文字にマッチさせるには「[]」で囲む。

example
正規表現:[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
のいずれの文字が文章中に出現する。
これらにマッチする正規表現を書け。

問題2の答え
cd

1回以上の繰り返しと、0回以上の繰り返し

1回以上の繰り返しは「+」、0回以上の繰り返しは「*」で表します。

example
正規表現:.*
意味:任意の文字が0回以上続く
マッチする文字:空文字、a、aa、0123
example
正規表現:[0-9A-z]+ 
意味:半角英数字が1文字以上続く
マッチする文字:a、aaa、0c1c2c3

メタ文字へのマッチ

メタ文字へマッチさせるには、「\メタ文字」とします。

example
正規表現:\.
マッチする文字:.

パターンが連続する回数を指定する

記号  意味
{n} 直前のパターンがn回続く
{n,} 直前のパターンがn回以上続く
{n,m} 直前のパターンがn回以上m回以下続く
text
郵便番号:123-4567
電話:03-1234-5678
内線:555

問題4

textの中から、郵便番号にマッチする正規表現を書け。

問題3の答え
[a-z]-\d{1,2}

0回か1回の繰り返し

0回か1回の繰り返しは「?」で表します。
例えば、appleかapplesをマッチしたい時は、apples?とすると、直前の文字の0回か1回の繰り返しとなり、apple or applesに対応します。

問題5

httpかhttpsで始まるURLにマッチする正規表現を書け。

問題4の答え
\d{3}-\d{4}

行の先頭か最後とマッチ

行の先頭は「^」、行の最後は「$」です。

複数パターンへのマッチ

複数パターンのいずれかにマッチしたい時は、「|」で区切る。
プログラミングでいうorと一緒。

(this|that) これで、this or thatにマッチする。

問題6

text
This is a pen.
this is a pen.
That is a pen.
that is a pen.

上記の文章のいずれかの文が与えられた時に、文頭のThis,this,That,thatにきちんとマッチする正規表現を書け。

問題5の答え
https?//[0-9A-z\.]+

[]内で否定したい時

example
正規表現:ABC[^a-z]
意味:ABCとa~z以外のすべての文字
マッチする文字:ABCD, ABCZ

問題7 応用問題

メールアドレスにマッチする正規表現を書け。

問題6の答え
([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回
^ 文字列の先頭
$ 文字列の末尾
. 任意の一文字
[] []内のいずれかの文字

※ 自分も初心者なので、間違え等ありましたらご連絡お願い致します。

問題7の答え
[\w.\-]+@[\w\-]+\.[\w.\-]+
64
68
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
68