3
4

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 1 year has passed since last update.

chatgptが正規表現の訓練に付き合ってくれた話

Last updated at Posted at 2023-05-10

はじめに

今日はフロントのバリデーションで正規表現に触れる機会がありましたが、行いたい振る舞いを実装するのに時間がかかってしまったため、おさらいしてみました。

まず、以下を入力しました

正規表現を何もみずにかけるようなエンジニアはつよいとだれかがいってた。
正規表現のインストラクターとしてふるまって下さい。
いくつか問題を出して、添削や解説を行ってください。

会話をした後に、最後に「これまでの会話をマークダウン形式でまとめてください」と入力しました。

正規表現についての会話

問題の提示

  • メールアドレスの正規表現を作成してください。([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+)
  • 郵便番号の正規表現を作成してください。(\d{3}-\d{4})
  • 電話番号の正規表現を作成してください。([0|+81][0-9]{3,5}[0-9]{1,4},[0-9]{4})
  • URLの正規表現を作成してください。((http | https)://[a-zA-Z0-9.-]+(/[a-zA-Z0-9_./-]+)*)
  • 身分証明書番号の正規表現を作成してください。([a-zA-Z]\d{12})

正規表現についての解説

  • 正規表現は、文字列のパターンを表すための言語です。
  • 正規表現を使うことで、文字列の検索や置換などを柔軟かつ効率的に行うことができます。
  • 正規表現は、様々なプログラミング言語やツールでサポートされています。

正規表現の解説

  • **^\d{3}-\d{4}$**は、3桁の数字、ハイフン、4桁の数字のパターンにマッチする正規表現です。(例: 123-4567)
  • **^\d{3}-\d{4}-\d{4}$**は、3桁の数字、ハイフン、4桁の数字、ハイフン、4桁の数字のパターンにマッチする正規表現です。(例: 123-4567-8901)
  • **^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$**は、メールアドレスのパターンにマッチする正規表現です。([username]@[domain].[tld]) 例: john.doe@example.com
  • **^(http | https)://[a-zA-Z0-9.-]+(/[a-zA-Z0-9_./-]+)*$**は、URLのパターンにマッチする正規表現です。([protocol]://[hostname]/[path]) 例: https://www.example.com/index.html
  • **[a-zA-Z]\d{12}**は、アルファベット1文字に続いて12桁の数字のパターンにマッチする正規表現です。(例: A123456789012)

正規表現の詳しい解説

かなり詳しい解説をしてくれました。

例えば、メールアドレスのパターンについて以下のような解説をしてくれました

^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

  • この正規表現は、**XXX@YYY.ZZZ**形式の電子メールアドレスを検証するために使用されます。
  • ^ は文字列の先頭を表します。
  • [a-zA-Z0-9_.+-]+ は、1つ以上の文字(大文字、小文字、数字、ピリオド、アンダースコア、プラス、ハイフン)を表します。
  • @ は@記号を表します。
  • [a-zA-Z0-9-]+ は、1つ以上の文字(大文字、小文字、数字、ハイフン)を表します。
  • \. はピリオド文字をエスケープして表します。
  • [a-zA-Z0-9-.]+ は、1つ以上の文字(大文字、小文字、数字、ピリオド、ハイフン)を表します。
  • $ は文字列の末尾を表します。

予約された正規表現一覧

  • . : 任意の1文字にマッチ
  • ^ : 文字列の先頭にマッチ
  • $ : 文字列の末尾にマッチ
  • * : 直前の表現に0回以上マッチ
  • + : 直前の表現に1回以上マッチ
  • ? : 直前の表現に0回か1回マッチ
  • {n} : 直前の表現にn回マッチ
  • {n,} : 直前の表現にn回以上マッチ
  • {n,m} : 直前の表現にn回以上、m回以下マッチ
  • [] : キャラクタークラス。括弧内のいずれかの文字にマッチ
  • () : グループ化。後述の量指定子や論理演算子でグループ化できる
  • | : 論理和。AまたはBにマッチ
  • \ : エスケープ文字。特殊文字をエスケープする
  • \d : 数字にマッチ。[0-9]と同じ
  • \D : 数字以外にマッチ。[^0-9]と同じ
  • \w : 単語構成文字にマッチ。[a-zA-Z0-9_]と同じ
  • \W : 単語構成文字以外にマッチ。[^a-zA-Z0-9_]と同じ
  • \s : 空白文字にマッチ。[ \t\n\r\f\v]と同じ
  • \S : 空白文字以外にマッチ。[^ \t\n\r\f\v]と同じ

すごいっす。

あれ、これ俺正規表現の文法身に着ける必要ある...?と思ってしまった僕でした。

文法自体というよりも、「物事を構造化して整理する力」 が求められている気がします。

おわりに

作るアプリのテーマが決まったので、次回は設計とかしようかなと思います。

ではまた。

3
4
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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?