Web Developer's Struggle Memories

日々の業務から思ったこと、学んだことを書き連ねていきます。

おそらく業務で使うであろう正規表現集め(※JavaScriptを使用)

はじめに

ちょこちょこ正規表現を業務で使う(例えばバリデーションチェックのためとか)が、 そのたびに勉強しないとなーと思って特に何かしたわけではなく、気付いたら数年経ってしまったので、 一応勉強したという実績を残したかったのでこんなブログを書いた。 最初はタイトルをJavaScript正規表現100本ノック!としようとしたが止めた。(100本も用意できなかっただけ)

じゃあ、やっていくよー。

文字列から改行コードを取り除く

Q: 文字列内に改行コードが含まれている場合があるため、削除する
A:

let test = "hoge\nfugafuga\r\npiyo"
test.replace(/\r?\n/g, '')

ファイルパスからディレクトリ・ファイル名・拡張子を抽出

Q: Unix系OSにおいてファイルパスからディレクトリ部分とファイル名と拡張子を抽出する
A:

path = '/var/www/hoge.txt'

// 'split_path'の中身は["/var/www/hoge.txt", "/var/www/", "hoge", "txt"]
let split_path = path.match(/(.*\/)?(.*?)\.(\w+)?/)

// ディレクトリ部分は2つ目
console.log(paths[1])

// ファイル名は3つ目
console.log(paths[2])

// 拡張子は4つ目
console.log(paths[3])

datetimeから年・月・日を抽出する

Q: 2016-09-10 21:31:25という日時データがあったら、20160910を抽出する
A:

let datetime = '2016-09-10 21:31:25'

// 'split_date'の中身は["2016-09-10", "2016", "09", "10"]
let split_date = datetime.match(/([12]\d{3})[-\/\s](0?[1-9]|1[0-2])[-\/\s](0?[1-9](?![0-9])|[12][0-9]|3[01])/)


// 年は2つ目
console.log(split_date[1])
// 月は3つ目
console.log(split_date[2])
// 日は4つ目
console.log(split_date[3])

補足

  • スラッシュ「/」で句切られていた場合
  • 半角スペースで句切られていた場合
  • 年は現実を考えると19xx 〜 20xx
  • 月は01 or 1 〜 12
  • 日は01 or 1 〜 31

を考慮する必要がある。

郵便番号を抽出する

Q: 氏名、メールアドレス、電話番号、郵便番号、住所がまとまっている個人情報データからメールアドレスを抽出する
A:

// user_infoという変数にデータが入っているものとする
user_info.match(/\d{3}-?\d{4}/)

補足

区切りなしの場合単に数字7桁を抽出。 また、旧郵便番号(3桁 or 5桁)は考慮しないものとする。

電話番号を抽出する

Q: 氏名、メールアドレス、電話番号、郵便番号、住所がまとまっている個人情報データから、電話番号(例:03-1234-5678)を抽出する
A:

// user_infoという変数にデータが入っているものとする
user_info.match(/(0\d{1,4})[-\(\s](\d{1,4})[-\)\s](\d{4})/)

補足

  • 日本の標準的な電話番号なので頭は0固定
  • 半角スペースで句切られている場合
  • 03(1234)5678の形式の場合

も考慮する必要があるが、何の文字でも区切られていない場合は判断がつかないため除外。

メールアドレスを抽出する

Q: 氏名、メールアドレス、電話番号、郵便番号、住所がまとまっている個人情報データからメールアドレスを抽出する
A: 簡略化したものなら以下。

// user_infoという変数にデータが入っているものとする
user_info.match(/[\w\-\.]+@[\w\-\.]+\.[a-zA-Z]+/)

より厳密にやるとなるとかなり難しいので、こちらのリンクを参照
→ Email Address Regular Expression That 99.99% Works.

(正直途中意味がわからない…)

「¥」表示を「円」で表示

Q: ¥12,345と表示されているものを12,345円に変更
A:

let price = '¥12,345'
price.replace(/¥(\d{1,3}(,\d{1,3})*)/, '$1円')

数字をカンマ区切りで表示する

Q: 12345678という数字を12,345,678と表示する
A:

let num = 12345678
String(num).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')

これはPHPならnumber_format()という関数が存在するので、JavaScriptでもほしい。

パスワードなどの文字列に数字と英字が両方含まれているかチェック

Q: 文字列に半角数字と半角英字が最低でも1文字ずつ含まれているかチェック
A:

let str = '0.@aE-3_9'
str.match(/^(?=.*[0-9])(?=.*[a-zA-Z])[0-9a-zA-Z\-\_\.@]+$/)

終わりに

  • これはこう書けばもっと簡単に書けるよ!
  • こんな書き方もあるよ!
  • これ間違ってるぞボケ!
  • これもよく使うぞ!

等、ご意見はいつでもwelcomeですので、是非お気軽にいただけると筆者喜びます。(マサカリの場合は「心の修復時間」をいただく可能性があります)

正規表現はプログラムだけでなく、例えばLinuxのコマンドでも使うし、下手にプログラムで制御構文使うところを一発で書けたりもするので、 みんなも是非逃げずに勉強してみよう!

では($・・)/~~~

参考文献