LoginSignup
1
1

More than 3 years have passed since last update.

100日後にエンジニアになるキミ - 46日目 - プログラミング - 正規表現について

Posted at

昨日までのはこちら

100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて

100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて

100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1

100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1

100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1

100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1

正規表現とは

ざっくり言うと様々な文字列を一つの文字列で表現する表記法です。

文字列には色々なパターンの文字列があります。
例えばメールアドレスだったり、電話番号はある一定の法則に従って文字列の体系ができています。

例:
電話番号:090-1239-9283
メールアドレス:kyonudaisuki@otupydaisuki.com

電話番号などは沢山の種類がありますが、これを1つの文字列としてまとめることができます。
それが正規表現となります。

正規表現は通常の文字 (a ~ z など) とメタキャラクタという
特殊文字から構成される文字列のパターンになります。

何が便利なのか?

例えば手元のファイルのデータの中から電話番号を全て探すことを考えます。

電話番号は11桁の0-9までの数字で構成される番号体系です。
種類数で行くと10の11乗近くの番号が存在することになります。

これを全て手入力して検索する労力を考えると途方に暮れてしまいます。
電話番号のルールに従った文字列1つで検索できれば入力は1回で済みます。

正規表現のパターンを覚えるのは少し大変ですが
一度覚えてしまえば、どのプログラム言語でも用いることができるため
使い回しが効く便利な表現方法であるため、頭に入れておきましょう。

正規表現パターン

正規表現に用いられる基本文字

文字 説明 正規表現の例 マッチする例
. 任意の1文字 にマッチします。 .
+ 直前の文字が 1回以上 繰り返す場合にマッチします。
最長一致。条件に合う最長の部分に一致します。
otu+py otupy
otu...py
* 直前の文字が 0回以上 繰り返す場合にマッチします。
最長一致。条件に合う最長の部分に一致します。
otu*py otpy
ot...py
? 直前の文字が 0個か1個 の場合にマッチします。
最長一致。条件に合う最長の部分に一致します。
otu?py otpy
otupy
+? 直前の文字が 1回以上 繰り返す場合にマッチします。
最短一致。条件に合う最短の部分に一致します。
otu+?py otupy
otu...py
*? 直前の文字が 0回以上 繰り返す場合にマッチします。
最短一致。条件に合う最短の部分に一致します。
otu*?py otpy
ot...py
?? 直前の文字が 0個か1個 の場合にマッチします。
最短一致。条件に合う最短の部分に一致します。
otu??py otpy
otupy
| いずれかの条件 (OR条件) として使われます。 otu(py|pi) otupy
otupi
\ 直後の正規表現記号を エスケープ します。 otu\+py otu+py
[...] 角括弧に含まれるいずれか1文字にマッチします。 [abc]
[a-c]
a, b, c
[^...] 角括弧に含まれる文字以外にマッチします。 [^abc]
[^a-c]
a, b, c
以外の文字
(...) 文字を1つのグループにまとめることができます。 otu(py|pi) otupy
otupi
{n} 直前の文字の桁数を指定できます。 a{3} aaa
{n,} 直前の文字の最小桁数のみ指定できます。 a{3,} aaa
aaaa...
{n,m} 直前の文字の最小桁数と最大桁数を指定できます。
最長一致。条件に合う最長の部分に一致します。
a{3,4} aaa
aaaa
{n,m}? 直前の文字の最小桁数と最大桁数を指定できます。
最短一致。条件に合う最短の部分に一致します。
a{3,4}? aaa

定義された正規表現

文字 説明 対応する表現
\t タブ (なし)
\r 改行。CR(Carriage Return:0x0D) (なし)
\n 改行。LF(Line Feed:0x0A) (なし)
\d すべての数字 [0-9]
\D すべての数字以外の文字 [^0-9]
\s 垂直タブ以外のすべての空白文字 [ \t\f\r\n]
\S すべての非空白文字 [^ \t\f\r\n]
\w アルファベット、アンダーバー、数字 [a-zA-Z_0-9]
\W アルファベット、アンダーバー、数字以外の文字 [^a-zA-Z_0-9]

特定の位置関係を表す正規表現

文字 説明 正規表現の例 マッチする例
^ 直後の文字が行の 先頭 にある場合にマッチします。 ^otupy otupy...
$ 直前の文字が行の 末尾 にある場合にマッチします。 otupy$ ...otupy
< 単語の先頭にマッチします。 \< *otupy
> 単語の末尾にマッチします。 \> otupy*
\b 単語の先頭か末尾にマッチします。 \b *otupy*
\B 単語の先頭か末尾以外にマッチします。 \B otupy
\A ファイルの先頭にマッチします。 \A (なし)
\z ファイルの末尾にマッチします。 \z (なし)
\G 直前の一致文字列の末尾にマッチします。 \G (なし)

正規表現の例

よく使われる正規表現

Email アドレス
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

URL
^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

ドメイン名
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z-]{2,}$

固定電話番号
^0\d(-\d{4}|\d-\d{3}|\d\d-\d\d|\d{3}-\d)-\d{4}$

携帯電話番号
^0[789]0-\d{4}-\d{4}$

フリーダイヤル
^(0120|0800)-\d{3}-\d{3}$

日付 (YYYY-MM-DD)
^\d{4}-\d\d-\d\d$

郵便番号(XXX-XXXX)
^\d{3}-\d{4}$

都道府県
^.{2,3}[都道府県]$

クレジットカード
4[0-9]{12}(?:[0-9]{3})?
5[1-5][0-9]{14}
(?:2131|1800|35\d{3})\d{11}

IPアドレス
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

半角英数字のみ
/^[0-9a-zA-Z]*$/

全角ひらがな
^[ぁ-んー]*$

全角カタカナ
^[ァ-ンヴー]*$

半角英数記号のみ
^[a-zA-Z0-9!-/:-@¥[-`{-~]*$

色々なパターン

a から始まって z で終わる 3 桁の文字列
a.z

a から始まって z で終わる 3 桁以上の文字列
a.+z

4 桁の半角数字
\d{4}

4 桁以上の半角数字
\d{4,}

n ~ m 桁の半角数字
\d{n,m}

桁区切りのカンマ付数字列
\b\d{1,3}(,\d{3})*\b

英単語
\b[\u\l]+\b

特殊文字

空白行
^\n

行全体
^.*$

まとめ

正規表現は様々なパターンがありますが書かないと覚えられません。
一つ一つ試してみて、どう言う書き方ならヒットするかなどを
調べて書いて試して覚えましょう。

君がエンジニアになるまであと54日

作者の情報

乙pyのHP:
http://www.otupy.net/

Youtube:
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter:
https://twitter.com/otupython

1
1
0

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
1
1