java 正規表現

今更だけどjava正規表現
今回は携帯電話番号の形式になっているかを調査する。

java正規表現を用いた入力値チェックをするときには
String#matchesメソッドを使用
Patternクラス・Matherクラスを使用する
の2通りが考えられるので1つずつ見ていく。

①String#matches

String target = "080-1234-5678";
target.matches("0[7-9]0-[0-9]{4}-[0-9]{4}"); //trueを返す

※String#matchesは「完全一致」のみtrueとなるので注意

String target = "0080-1234-5678";
target.matches("0[7-9]0-[0-9]{4}-[0-9]{4}"); //falseを返す

②PatternとMatcher

String target = "080-1234-5678";
Pattern p = Pattern.compile("0[7-9]0-[0-9]{4}-[0-9]{4}");
Matcher m = p.matcher(target);

m.find(); //trueを返す

Matcherクラスにはfind以外にもいろいろ便利そうなメソッドがある。 目的によって使い分けする感じか。

Matcherいろいろ

①置換
//パターンに一致した文字を置換する
String str = "aabWooabWoobWooab";
//「aが0個以上b」の正規表現
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher(str);
//Matcher#replaceAllを使用して正規表現に合致した個所すべてを置換する
String replaced = m.replaceAll("-");
//-Woo-Woo-Woo-が出力される
System.out.println(replaced);

//Matcher#replaceFirstを使用して正規表現に合致した最初の個所を置換する
//-WooabWoobWooabが出力される(最初だけが「-」で置換される)
String replaced = m.replaceFirst("-")
②Matherの文字列表現
//#toString()呼び出すだけなんだが
System.out.println(m.toString());

結果

java.util.regex.Matcher[pattern=a*b region=0,17 lastmatch=aab]

なにこれわからん・・と一瞬思ったが割と単純。
要は最後に使用した時の結果を出している。 最後に使ったのがString replaced = m.replaceFirst("-")だったので、
pattern=a*b → こわは言わずもがなターゲットとする正規表現
region=0,17 → マッチさせた文字列の対象領域(aabWooabWoobWooabの始点0と終点17)
lastmatch=aab → 最後にマッチした個所(findFirstを最後に使用したのでaabがlastmatchになる)

今日はここまで!