Javaで正規表現

f:id:monozukuri-bu:20190716225407j:plain

初めましてshadowです。
扱うたびになんだったっけ?と忘れてしまう正規表現を備忘録としてまとめてみました。

文字
説明
. 任意の1文字
\w 英単語を構成する文字(a∼z,A∼Z,1∼9)
\W 英単語を構成する文字以外
\s 空白文字(半角スペース、タブ、改行、キャリッジターン)
\S 空白以外
\d 半角数字(0∼9)
\D 半角数字以外
\b 単語の境界に一致
[abc] 指定された文字のどれかに一致(この場合abcのいずれかに)
[a-z] マッチする文字の範囲を指定する(この場合aからzの範囲)
(pattern1|pattern2) 指定されたパターンのいずれかにマッチ
* 0回以上の繰返しにマッチ
+ 1回以上の繰返しにマッチ
{n} n回の繰返しにマッチ
{n,} n回以上の繰返しにマッチ
{n,m} n回以上m回以下の繰返しにマッチ
? 0回または1回にマッチ
(pattern)+ patternの1回以上の繰返しにマッチ
^pattern 文字列の先頭にpetternがある文字列にマッチ
pattern$ 文字列の末尾にpatternがある文字列にマッチ

実践

実際に使うことがありそうな正規表現をまとめてみました。

郵便番号

ハイフン有り

^\d{3}-\d{4}$

ハイフン無し

^\d{7}$

電話番号

固定電話

固定電話の場合は先頭が0で始まります。
その後に市外局番1∼4桁、市内局番1∼4桁を組み合わせた5桁の数字、そして4桁の加入者番号が続き、全部で10桁になります。

^0\d-\d{4}-\d{4}$
^0\d{2}-\d{3}-\d{4}$
^0\d{3}-\d{2}-\d{4}$
^0\d{4}-\d-\d{4}$

携帯電話

070、080、090の3パターン先頭に4桁、4桁と続きます。

^0[789]0-\d{4}-\d{4}$

IP電話

先頭が050で始まり、4桁、4桁と続きます。

^050-\d{4}-\d{4}$

フリーダイヤル

先頭0120の3桁、3桁です。

^0120-\d{3}-\d{3}$

カード番号

全てを入れると多いのでよく見るものだけ書いています。

VISA

4から始まる13桁か16桁の番号です。

^4\d{12}(\d{3})?$

MasterCard

51∼55で始まる16桁の番号です。

^5[1-5]\d{14}$

Discover Card

6011から始まる16桁の番号です。

^6011\d{12}$

American Express

34か37で始まる15桁の番号です。

^3[47]\d{13}$

JCB

2131か1800で始まる15桁、あるいは35で始まる16桁の番号です。

^(2131|1800|35\d{3})\d{11}$

パスワード

半角英子文字、大文字、数字を各1文字ずつ含み、8文字以上100文字未満の文字列です。

^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[a-zA-Z\d]{8,100}$

動作確認

用意した文字列達はこちらです。
1つずつマッチするものが入っています。

"457-9854"
"4561-9852"
"4569854"
"65976566646"
"0120-572-645"
"06-2485-5875"
"4545-68554-54"
"072-654-3213"
"090-6548-8452"
"0754-89-7845"
"8-8-8"
"050-2845-9754"
"04745-8-8541"
"4568215795632410"
"6011456210587101"
"1234585412005698" 
"346569321047475"
"180069397954858"
"12345678912346578"
"5564872101047896"
"passwd"
"p@sswd1234"
"Passwd1234"

実行結果は以下のようになりました。

457-9854 は ^\d{3}-\d{4}$ にマッチします
4569854 は ^\d{7}$ にマッチします
06-2485-5875 は ^0\d-\d{4}-\d{4}$ にマッチします
072-654-3213 は ^0\d{2}-\d{3}-\d{4}$ にマッチします
0754-89-7845 は ^0\d{3}-\d{2}-\d{4}$ にマッチします
04745-8-8541 は ^0\d{4}-\d-\d{4}$ にマッチします
090-6548-8452 は ^0[789]0-\d{4}-\d{4}$ にマッチします
050-2845-9754 は ^050-\d{4}-\d{4}$ にマッチします
0120-572-645 は ^0120-\d{3}-\d{3}$ にマッチします
4568215795632410 は ^4\d{12}(\d{3})?$ にマッチします
5564872101047896 は ^5[1-5]\d{14}$ にマッチします
6011456210587101 は ^6011\d{12}$ にマッチします
346569321047475 は ^3[47]\d{13}$ にマッチします
180069397954858 は ^(2131|1800|35\d{3})\d{11}$ にマッチします
Passwd1234 は ^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[a-zA-Z\d]{8,100}$ にマッチします

まとめ

Java正規表現を使って複数の候補からマッチする文字列を検索しました。
色々なパターンがあるので使いこなしていきたいです。