よく使う正規表現について整理


#はじめに
Webサイトや各種システムの実装に携わっていると、送信フォームでのバリデーションや検索プログラムなどで、正規表現を使った処理を実装する機会は多くあります。

今更ではありますが、正規表現について調べたり確認することが多いので
備忘録として整理してみることにしました。



#ワイルドカードと正規表現の違い

念のためですが、ざっくりと理解していると紛らわしい可能性があるので、改めて以下に整理します。
「ワイルドカード」「正規表現」とは、両方とも「文字列の集合を一つの文字列で表現する方法」です。どちらも複雑な文字列検索を効率的に行うことができます。違いは以下の通りです。

ワイルドカード⇒「*」「?」の2種類の記号で、文字列の集合を表現
正規表現⇒ワイルドカードの「*」「?」に加えて、さらに他の記号を使ってより複雑な文字列の集合を表現

よって、正規表現はワイルドカードを更に拡張したものと言えます。


具体例
ワイルドカード
「*」「?」の2種類の記号で、文字列の集合を表現します。

パターン	意味	記述例	該当例
*	任意の長さの文字	や*	「やま」「やまだ」「やりいか」など
?	任意の1文字	や?	「やつ」「やぎ」など
【注意】「*」の後にある文字列
※UNIX系・・・条件として扱われる
※Windows系・・・条件として扱われない

 
#正規表現
ワイルドカードの「*」「?」に加えて、さらに他の記号を使ってより複雑な条件を指定できます。




|パターン式|意味（内容）|
|---|---|
[ ]|[ ] 内に指定した文字のどれかと一致
[^ ]|[ ] 内に指定した文字でない場合に一致する
^|行頭と一致
$|行末と一致
.|任意の１文字と一致
( )|正規表現をグループにまとめる
||前後にある正規表現のいずれかと一致
+|直前の正規表現の1回以上の繰り返しに一致
?|直前の正規表現に0回 or １回一致
{m,n}|直前の正規表現のm～n回の繰り返しに一致
+?|直前の正規表現の1回以上の繰り返しに一致
*?|直前の正規表現の0回以上の繰り返しに一致
??|直前の正規表現に0回もしくは１回一致
*|直前の正規表現の0回以上の繰り返しに一致
{m,n}?|直前の正規表現のm～n回の繰り返しに一致
\|メタ文字を打ち消す
\A|文字列の先頭と一致
\b|単語境界と一致 (\w と \W の間の空文字列と一致)
\B|\B 以外と一致
\d|数字と一致 ( [0-9] と同じ )
\D|\d以外と一致
\s|空白文字と一致
\S|\s 以外と一致
\w|英数字とアンダースコア_に一致
\W|\w 以外と一致
\Z|文字列の末尾と一致
※参考：【正規表現とは】一覧表と例題



#よく使う表現まとめ


更に、もう数え切れないほど検索し、試行した正規表現式を下記に記載しておきます。
（[よく使う正規表現はもうググりたくない！](https://qiita.com/dongri/items/2a0a18e253eb5bf9edba)より引用）

```
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]+$
```

#言語による違いについて

更に、言語にごとの利用例も上記の[よく使う正規表現はもうググりたくない！](https://qiita.com/dongri/items/2a0a18e253eb5bf9edbaで紹介されているので、ぜひ参考にしてみてください。

ここには現在自分が利用する頻度の高い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
```


まとめ

正しく理解し、チートシートも手元に用意していちいちググらなくても正しく活用できるようしたいですね。

チェックにはツールもフル活用しましょう。使えるものは何でも使えっていうのが大事（適当）。
[正規表現じぇねれーた](http://rtilabs.rti-giken.jp/files/2011_11_02/)
[正規表現チェッカー](http://okumocchi.jp/php/re.php)




参考：
[よく使う正規表現はもうググりたくない！](https://qiita.com/dongri/items/2a0a18e253eb5bf9edba)

[IT用語辞典－ワイルドカード](http://e-words.jp/w/%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89.html)

WWWブログ－正規表現とはメタ文字とサンプル一覧
(http://www-creators.com/archives/4278)