タイトル通りによく使う正規表現を毎回ググるのが効率悪いのでまとめてみました。それとOrigamiで使ってる各言語で正規表現のサンプルを書いてみました。
正規表現式
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);
}
}
「英数字」と「大文字小文字26英字+数字」は同じ意味でしょうか。
@7of9 失礼しました。同じ意味でした。下の方削除します。
Ruby の場合,
などと書かなくても正規表現リテラルがあるので,
/云々/
と書けます。
この書き方だと,正規表現がバックスラッシュを含む場合に,
などと面倒なエスケープをせずに
/\d/
と書けます。
なお,
という書き方は何の問題もありませんが,
===
はcase
式やgrep
などで暗黙に呼ばれるメソッドというテイスト(?)なので,という書き方のほうをお勧めします。
また,非常に大事なことですが,Ruby の
^
,$
は文字列の先頭・末尾ではなく行頭・行末です。従って,たとえば
str
が数字のみからなっていることを確認しようとしてと書いてはいけません。
str
が"abc\n123\ndef"
のような場合でも真になってしまいます。この手のバグは極めて深刻なセキュリティー上の問題につながる恐れがあります。
以上が Ruby についてですが,正規表現の内容についても気になるところがちらほらあります。
たとえば固定電話が
となっていますが,市外局番は最大 4 桁ですよね。
(市外局番は 0 を除いた部分を指すようです。03 の 0 はプレフィクスで,市外局番の一部ではないんですね。いま知りました)
Rubyときなのですが、
@scivola さんの言うように
/云々/
もできますし、以下のように
%r
を使って書くこともできます。%r
の利点は/
などをエスペケープせずに使えるので、URLを以下のように書けるようになることです。%r{^(http|https)://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$}