0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コピペで済ませてきた正規表現をちゃんと勉強してみる

Last updated at Posted at 2021-10-15

前いた会社で正規表現をほとんど使う機会がなく、転職した現在の会社で正規表現の知識が必要になったのでちゃんと勉強することにしました。
ひろゆきにならってとほほの正規表現入門を使用して勉強しました。

参考資料:

使用したツール

こちらを使っていきます。

普通に同じ文字でマッチ

スクリーンショット 2021-10-15 7.51.38.png

メタ文字

メタ文字とは

メタ文字とは、その文字本来の意味とは異なり、プログラムで特別な意味を持たせた文字のことである。 例えば、正規表現では「+」は「足す」ではなく1回以上の連続文字を意味するメタ文字である。 正規表現による検索では、A+Bで検索すれば、AB、AAB、AAABなどのいずれとも一致する。

 数字でマッチ

\dを使うと数字をマッチさせることができます

スクリーンショット 2021-10-15 13.13.50.png

英数字でマッチ

\wを使うと英数字をマッチさせることができます

スクリーンショット 2021-10-15 13.15.55.png

.を使用

. => 任意の一文字にマッチ

スクリーンショット 2021-10-15 7.52.53.png

[ ]を使用

[ ] => [ ]の中に入れた特定の文字にマッチ

スクリーンショット 2021-10-15 7.58.14.png

また[ ]は-を入れることで範囲マッチもできるようになる

例えば
は~ふまでの文字を -を入れて使用するとはその範囲内ではないのでマッチしません。

スクリーンショット 2021-10-15 8.05.19.png

数字もいけます

スクリーンショット 2021-10-15 8.08.42.png

ひらがな全てを表す場合、

[ぁ-ん]

カタカナ全てを表す場合

[ァ-ヴ]

で表す。

小文字から始まるのが変に思えるのですがこれは文字コード表の順番で決まります。

文字コード表を見ると普段見慣れない「ゐ、ゑ」は「ん」よりも前にあり、範囲内なのでマッチします

スクリーンショット 2021-10-15 8.13.42.png

グループ化

()を使うことで()内のどれかにマッチします。文字の区切りには |を使用します。

スクリーンショット 2021-10-15 8.21.29.png

先頭マッチ

^を使うことで先頭の文字のみマッチします

スクリーンショット 2021-10-15 8.32.07.png

Javaという文字は文の中で2つあるのですが、^を使用したことにより、文の先頭のJava部分だけマッチしました。

末尾マッチ

$を使うことで末尾の文字のみマッチします

スクリーンショット 2021-10-15 8.34.00.png

これは先程の先頭マッチの逆です。
また$を書く位置も関係します。

繰り返し文字マッチ

*を使うと0回以上繰り返す文字にマッチ

「」がついている文字を探したりするのに使えます。

スクリーンショット 2021-10-15 8.42.02.png

後はこんな感じの使い方もできます。

image.png

+を使うと1回以上繰り返す文字にマッチ

*を使って「」をマッチさせていましたが、実は「」の中が空でもマッチしてしまいます。

スクリーンショット 2021-10-15 9.00.07.png

そこでこれを防ぐためには1回以上繰り返す文字にマッチする+を使います。

スクリーンショット 2021-10-15 8.58.20.png

こうすることで「」の中に何も文字が入っていない(1つ以上の文字が入っていない)ため、マッチさせることなく検出できるようになりました。

?を使うとあってもなくてもマッチ

aという文字があってもなくてもマッチされます。

image.png

{n}を使うと繰り返しの数を指定できます。

「CoffeeScript」は続けて使われる箇所(ffee)があるので繰り返しマッチを使えます。

スクリーンショット 2021-10-15 9.17.40.png

{n,m}使うと繰り返しの範囲を指定できます。

スクリーンショット 2021-10-15 13.11.48.png

今までコピペで済ませてきた正規表現を勉強した知識で読み解いてみる

出典: 基本的な正規表現一覧

Email アドレス (RFC準拠ではない)

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  1. 1文字以上の英数字(\w+)で始まる \w+
  2. 0文字以上の-+.'のどれか([-+.'])と英数字を含めた文字 ([-+.]\w+)*)
  3. @の後は1文字以上の英数字と0文字以上の、-.のどれか([-.])と英数字を含めた文字 (@\w+[-.]\w+)*
  4. コロンと一文字以上の英数字と0文字以上の -.のどれか([-.])と英数字を含めた文字 .\w+([-.]\w+)*

URL

^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  1. s?の部分でsがあってもなくてもおkとしています。つまりhttporhttpsのどちらかということです
  2. 一文字以上の'-'を含めた英数字とコロン([\w-]+\.)+
  3. 一文字以上の'-'を含めた英数字 [\w-]+
  4. 0文字以上の-./?%&=を含めた英数字  (/[\w-./?%&=]*)?

ドメイン名

^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z-]{2,}$

ドメインの基礎知識が必要になります

ピリオド(.)で区切られた部分は「ラベル」と呼ばれます。 一つのラベルの長さは63文字以下、ドメイン名全体の長さは、 ピリオドを含めて253文字以下でなければなりません。※1 ラベルには、英字(A~Z)、数字(0~9)、 ハイフン( - )が使用できます(ラベルの先頭と末尾の文字をハイフンとするのは不可)。 ラベル中では大文字・小文字の区別はなく、 同じ文字とみなされます。

長いので2つに分けます

[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]
先頭と末尾をハイフンにするということができないので、[a-zA-Z0-9]で-を入力できる正規表現をラップしています。
もし先頭と末尾にハイフンが入れられたら前半部分は[a-zA-Z0-9-]{1,63}だけで表現できるということですね

\.[a-zA-Z-]{2,}
\.はドットがメタ文字(バックスラッシュなしで使うといずれかの1文字の意味)なのでバックスラッシュでエスケープしてます
また最後の{2,}は2文字以上の意味で
まとめると.[a-zA-Z-]{2,}小文字、大文字の2文字以上の英字

example.comの.comの部分です

固定電話番号

^0\d(-\d{4}|\d-\d{3}|\d\d-\d\d|\d{3}-\d)-\d{4}$
  1. 0から始まり

携帯電話番号

^0[789]0-\d{4}-\d{4}$
  1. 必ず0から始まります
  2. 2つ目の数字は789のどれかです
  3. 真ん中の数字と最後の数字は4桁の数字です

IP 電話番号

^050-\d{4}-\d{4}$
  1. 必ず050 から始まります
  2. 真ん中の数字と最後の数字は4桁の数字です

フリーダイヤル

^(0120|0800)-\d{3}-\d{3}$
  1. 最初の数字は必ず0120もしくは0800で始まります
  2. 真ん中の数字と最後の数字は4桁の数字です

日付 (YYYY-MM-DD形式)

^\d{4}-\d\d-\d\d$
  1. 西暦が4桁で月が2桁、日が2桁です
    // 何で^\d{4}-\d{2}-d{2}じゃないのか分からないので詳しい人いたら教えて下さい

郵便番号

^\d{3}-\d{4}$
  1. 必ず最初の数字が3桁で次の数字が4桁です

感想

高校生の頃ちゃんと英語勉強した後に試験受けた時の「読める....!」という感覚になりました
またEmail,URL,ドメインは初見でわからなかったのでカンニングしました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?