LoginSignup
1
0

More than 1 year has passed since last update.

【勉強記録】正規表現の分解

Last updated at Posted at 2021-09-12

目次

  • 趣旨
  • マッチの確認
  • 分解してみる
  • 振り返り
  • 参考サイト

趣旨

正規表現について学習しました。
今回はこちらで公開されている正規表現のサンプルをいくつかお借りして、それを分解することでどのような表現で実現しているのか確認してみたいと思います。

マッチの確認

Pythonの標準モジュールである、re(正規表現操作)を利用して下記の通り確認していきます。
(手元ではこのコードで試しています。)

regular_expression.py
import re

numbers = "123"
# 「数字を1文字以上繰り返す」ことの確認
confirm = re.search('[0-9]+', numbers)
# => <re.Match object; span=(0, 3), match='123'>

分解してみる

本題です。

名前

^[-んァ-ヶー一-]+$
使われている表現 説明
^ 先頭文字にマッチ
[] 文字の集合を表す
ぁ-ん ひらがな
ァ-ヶ カタカナ
一-龠 漢字(Unicode JIS内字)
伸ばし棒
+ 直前の表現を1回以上繰り返す
$ 末尾にマッチ

言い換えると、
先頭から末尾までが、一文字以上のひらがな・カタカナ・漢字・ー(伸ばし棒)のいずれかで構成されている
ちなみに、ひらがなの表現が小文字の「ぁ」から始まる理由はUnicode対応 文字コード表の並びが、ぁ、あ、ぃ、い…という並びになっているからです。他も同様です。

電話番号

^0\d{1,4}-\d{1,4}-\d{3,4}$
使われている表現 説明
^ 先頭文字にマッチ
\d [0-9]と等価
{1,4} 直前の表現を1~4回繰り返す
$ 末尾にマッチ

先頭が0+1~4文字の数字、1~4文字の数字、末尾が3~4文字の数字で構成され、-(ハイフン)で繋がっている

メールアドレス

^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$
使われている表現 説明
^ 先頭文字にマッチ
a-zA-Z0-9 アルファベットの大文字/小文字/数字
+ 直前の表現を1回以上繰り返す
._- 記号
* 直前の表現を0回以上繰り返す
$ 末尾にマッチ

先頭文字と@の次の一文字はアルファベットか数字、加えて@以前はアルファベットか数字か定められた記号を0回以上、@以降は1回以上使用して構成されている
つまり最低限あればいいのは@前に1文字、@以降に2文字ということになります。1@23でマッチします。
尚、Pythonではバックスラッシュがエスケープ文字なので、このままでは"\"は認識されませんでした。
"\\"にしても変わらず、解決に至らなかったため検証としては不完全なものになってしまいました…。

振り返り

以前架空のECサイトを作成した際のバリデーションを設定するために今回取り上げた正規表現を使わせて頂いておりました。
改めて調べてみるとどういう仕組みで実現していたのかがよくわかりました。また、せっかくなら条件をもう少し厳しくしたいと思う点もあり、勉強した点を踏まえて変更してみたいと思います。
日本語として正確に表現するのはかなり冗長になるのである程度省略したつもりですが…ご覧の通りです。記号の強みですね。

参考サイト

https://designsupply-web.com/media/knowledgeside/1640/
https://docs.python.org/ja/3/library/re.html#module-re
https://www.ogiso.net/wiki/index.php?%BC%F8%B6%C8%BB%F1%CE%C1/%C0%B5%B5%AC%C9%BD%B8%BD
https://ameblo.jp/tondemonight/entry-1011710

1
0
1

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
0