3
3

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-31
1 / 10

正規表現とは?

  • 正規表現は、強力で柔軟、かつ効率的なテキスト処理の鍵を握る存在
  • 様々な用途に対応できる能力と表現力を持った一般的なパターン言語が発達してきた

いくつかの文字列を一つの形式で表現するための表現方法
image.png


上司からの依頼(ユースケース)

「郵便番号を1つの項目で管理しているWebシステム。これを別項目で管理するようになるので移行します!
ただ、現状正しい書式で入っていないものもいくつかあるのでまずはその数を調査してほしい!」


レコードは80万行あります!


依頼まとめ

1,住所項目に正しい郵便番号が設定されていないレコード数を調査
2,80万行のCSVファイルから(カンマで値を区切ったテキストファイル)
image.png
image.png


考えられる手法

1.CSVならEXCELが得意!Excelやスプレットシートに貼り付けて検索しよう!
→80万行、、やりたくない

2,俺の目に任せろ(目視で件数を数える)
→この根性は別のタイミングで活かしましょう


この要件の法則

  1. 行の中でカンマ3番目以降が郵便番号
  2. 郵便番号は3桁数字+ハイフン+4桁数字
    image.png

正規表現

この文字列で検索してみよう!
\d{3}-\d{4}

image.png
\d:数字を表現
{n}:繰り返し

ただ、このやり方には問題が、、。


image.png

  • 1603-8135のような行がヒットする
  • そもそも誤った郵便番号が設定されていない行を知りたい

この要件を満たすために以下の正規表現で検索をかけてみる。
(?<=^([^,]*,){3})(?!\d{3}-\d{4}[^\d])

image.png

解説

image.png

左の部分で先頭から3番目のカンマ区切り位置を表現して、右側で郵便番号の書式が存在しないことを表現している。


まとめ

正規表現を使えばあらゆるパターンで合致できる。
否定的後読み(?<=)や肯定的先読み(?=)は初めて知った。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?