Ruby
Python
JavaScript
Go
正規表現

よく使う正規表現はもうググりたくない!

タイトル通りによく使う正規表現を毎回ググるのが効率悪いのでまとめてみました。各言語で正規表現のサンプルを書いてみました。

正規表現式

  • Emailアドレス
    ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

  • ドメイン名
    ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$

  • インタネットURL
    ^(http|https)://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

  • ユーザー名 (Twitter username)
    ^[a-zA-Z0-9_\-.]{3,15}$

  • 固定電話
    ^0\d-\d{4}-\d{4}$

  • 携帯電話
    ^(070|080|090)-\d{4}-\d{4}$

  • IP電話
    ^050-\d{4}-\d{4}$

  • フリーダイヤル
    ^0120-\d{3}-\d{3}$

  • パスワード(大文字小文字英数字組み合わせ、特殊文字禁止、長さは8-10
    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

  • 日付 (YYYY-MM-DD)
    ^\d{4}-\d{1,2}-\d{1,2}$

  • 郵便番号
    ^\d{3}-\d{4}$

  • XML
    ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

  • 空白行
    \n\s*\r

  • 先頭後尾空白文字
    ^\s*|\s*$

  • IPアドレス
    \d+\.\d+\.\d+\.\d+

  • IPアドレス
    ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

  • 数字
    ^[0-9]*$

  • N桁数字
    ^\d{n}$

  • N桁以下数字
    ^\d{n,}$

  • M-N桁数字
    ^\d{m,n}$

  • ゼロから始まる数字
    ^(0[0-9]*)$

  • ゼロ以外から始まる数字
    ^([1-9][0-9]*)$

  • 小数点以下1-2位数字
    ^(\-)?\d+(\.\d{1,2})?$

  • 正整数
    ^[1-9]\d*$

  • 負整数
    ^\-[1-9]\d*$

  • 英数字
    ^[A-Za-z0-9]+$

  • 長さが3-20の全ての文字
    ^.{3,20}$

  • 大文字小文字26英字
    ^[A-Za-z]+$

  • 大文字26英字
    ^[A-Z]+$

  • 小文字26英字
    ^[a-z]+$

言語別

Go

package main

import (
    "fmt"
    "regexp"
)

func main() {
    rep := regexp.MustCompile(`^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$`)
    isEmail := rep.MatchString("dongri@qiita.com")
    fmt.Println(isEmail) // true | false
}

Ruby

#!/usr/bin/env ruby

rep = Regexp.new("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$")
isEmail = rep === "dongri@qiita.com"
puts isEmail

JavaScript

var regex = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
regex.test("dongri@qiita.com"); // true | false

var regex = new RegExp('^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$');
regex.test("dongri@qiita.com"); // true | false

Perl

#!/usr/bin/env perl

$rep = '^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$';
$email = 'dongri.@qiita.com';
if ($email =~ /$rep/) {
    print "valid";
} else {
    print "invalid";
}

Python

#!/usr/bin/env python

import re

rep = '^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$';
email = 'dongri@qiita.com';
isEmail = re.match(rep, email) != None;

print(isEmail);

Swift

import Foundation

let rep = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
let email = "dongri@qiita.com"
let isEmail = NSPredicate(format: "SELF MATCHES %@", rep).evaluate(with: email)

print(isEmail)

Java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String regex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
        String email = "dongri@qiita.com";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(email);
        Boolean isEmail = matcher.matches();

        System.out.println(isEmail);
    }
}

追記

想像以上にバズってツッコミ満載ですが、この記事の目的は弊社がこれらを使ってる、これらが一番良い式ではなく、あくまで一例を示してます。みなさんもおわかりかと思いますが、正規表現は効率良い、悪い、キレイ、汚いいろんな書き方もあれば要件によって100%汎用なものを作って毎回それを使うのは無理かと思います。基本的なベースがあれば、そこにちょっと手を入れてチューニングすれば自分達が必要な式を求められるんじゃないかと思います。そのようなニュアンスで書いたサンプルようなものでした。

Like, Stockしてる方々も参考になれると思いますので。引き続きツッコミお願いします。