【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】
正規表現とは?
正規表現とは、文字列が指定のフォーマットにマッチするか
調べる為のパターンのことです。
やぶからスティックになんだってぐらいカタカナがカミングしまくりですが、
今からお話する例を見るとイメージがつくと思います。
例えばこんなメモ帳があったとします。
apple
007
りんご
12345
アップルを3個食べました
—ここまで—
はい!この中から半角の数字だけ書かれた行を出力するプログラムを作ってください!
ちょっと難しそうですよね?
これ、正規表現を使えば簡単にできます!
具体的には、正規表現で「半角の数字だけ含む」というパターンを作って、
各行の文字列がそのパターンにマッチ(一致)するか調べるということになります。
正規表現で使う記号の種類と記載ルール
正規表現としてパターンを作成するには、以下のルールに従って記号を使います。
記号 | 説明 | 例 |
---|---|---|
^ | 文字列の始まり | ^ |
$ | 文字列の終わり | $ |
. | 任意の1文字 | . |
* | 指定の文字が0回以上含まれる(含まれなくても良い) | a* |
+ | 指定の文字が1回以上含まれる(1回は必ず含まれる) | a+ |
? | 指定の文字が0回、または、1回だけ含まれる(連続したものは対象外) | a? |
() | 括弧の中の文字をグループとして扱う | (abc) |
[] | 括弧の中の文字のいずれかが1回だけ含まれる | [abc] |
[^] | 括弧の中の文字をいずれも含まない | [^abc] |
| | 指定した複数文字列の内、いずれかの文字を含む(OR条件) | (abc|xyz) |
a-z | 小文字のアルファベット1文字 | [a-z] |
A-Z | 大文字のアルファベット1文字 | [A-Z] |
0-9 | 数字1文字 | [0-9] |
{n} | 指定の文字がn回数含まれる | a{3} |
{m,n} | 指定の文字がm回以上n回以下含まれる | a{1,3} |
\t | タブが1回だけ含まれる | \t |
\n | 改行が1回だけ含まれる | \n |
\ | エスケープ時に使う | \+ |
これらの記号をいくつも組み合わせて、1つの正規表現を作成します。
例えば、電話番号や郵便番号、メールアドレスなんかも
正規表現を使ってメモ帳の中から探し出すことができます。
また、正規表現で使う「*」や「?」などの記号を文字そのものとして扱う場合は、
前に「\」をつけて「\*」「\?」と書いて使います。
(この処理をエスケープと呼びます。)
正規表現の使い方
指定の文字列が正規表現のパターンとマッチするか調べるには、
PatternクラスとMatcherクラスを組合せて使います。
【使い方①】
まずは、Patternクラスの「compile」メソッドを使って、
正規表現のパターン文字列をセットします。
String regex = "正規表現のパターン";
Pattern p = Pattern.compile(regex);
compileメソッドは、戻り値として、
パターンをセットしたPatternクラスのオブジェクトを生成して返します。
【使い方②】
パターンがセットできたら、
Patternクラスの「matcher」メソッドを使って文字列と比較します。
String str = "比較したい文字列";
Matcher m = p.matcher(str);
matcherメソッドは比較結果をMatcherクラスのオブジェクトとして返します。
【使い方③】
比較処理ができたら、Matcherクラスの「find」メソッドで判定結果を確認できます。
boolean result = m.find();
findメソッドは比較結果をboolean型で返します。
パターンにマッチする場合はtrue、マッチしない場合はfalseになります。
Matcherクラスの便利なメソッド
Matcherクラスを使えば、文字列をチェックするだけではなく、
マッチした文字列を抜き出したり、別の文字列に置換したりできます。
サンプルコードと一緒に説明します。
マッチした文字列を取り出す(group)
マッチした文字列を取り出す時は「group」メソッドを使います。
例として対象の文字列から3桁の数字をすべて探して取り出してみます。
package example;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
// 3桁の数字を見つける為のパターンをセット
Pattern p = Pattern.compile("[0-9]{3}");
// 検索対象の文字列をセット
Matcher m = p.matcher("abc-123-あいう-456");
// マッチする文字列をすべて出力
while (m.find()) {
System.out.println(m.group());
}
}
}
実行結果は以下です。
123
456
指定の文字列の中に複数マッチするものがある場合、
findメソッドを使うごとにgroupメソッドで取得できる文字列が切り替わります。
while文の条件に使うことでfindできる限り出力するという動作が実現できます。
また、String型で抽出できるので、取り出した文字列のみ使う時に役立ちます。
マッチした最初の文字列を別の文字列で置換する(replaceFirst)
マッチした最初の文字列を置換するには「replaceFirst」メソッドを使います。
package example;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
// 3桁の数字を見つける為のパターンをセット
Pattern p = Pattern.compile("[0-9]{3}");
// 置換対象の文字列をセット
Matcher m = p.matcher("abc-123-あいう-456");
// マッチした最初の文字列だけ置換
String str = m.replaceFirst("000");
System.out.println(str);
}
}
実行結果は以下です。
abc-000-あいう-456
replaceFirstメソッドの引数に置換対象の文字列を指定して実行すると、
置換後の文字列をStringとして返します。
結果の通り、複数マッチする場合は、最初にマッチした部分だけ置換します。
マッチしたすべての文字列を別の文字列で置換する(replaceAll)
マッチしたすべての文字列を置換するには「replaceAll」メソッドを使います。
package example;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
// 3桁の数字
Pattern p = Pattern.compile("[0-9]{3}");
// 置換対象の文字列をセット
Matcher m = p.matcher("abc-123-あいう-456");
// マッチしたすべての文字列を置換
String str = m.replaceAll("000");
System.out.println(str);
}
}
実行結果は以下です。
abc-000-あいう-000
replaceAllメソッドの引数に置換対象の文字列を指定して実行すると、
置換後の文字列をStringとして返します。
結果の通り、複数マッチする場合は、マッチしたすべての部分を置換します。
Patternクラスの便利なメソッド
Patternクラスを使えば、指定した文字で文字列を分割することができます。
サンプルコードと一緒に説明します。
指定の文字で文字列を分割する(split)
文字列を分割するには「split」メソッドを使います。
例として「123-456-789」という文字列を「-」で分割してみます。
package example;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
// 分割文字に「-」をセット
Pattern p = Pattern.compile("-");
// 分割する文字列
String str = "123-456-789";
// 分割
String[] sptStrAry = p.split(str);
// 分割した文字列を順番に出力
for (String sptStr : sptStrAry) {
System.out.println(sptStr);
}
}
}
実行結果は以下です。
123
456
789
Patternクラスに文字列を分割する為の文字を
「compile」メソッドを使ってセットしてから「split」メソッドで分割します。
分割された文字列はString型の配列として返されます。
配列をループして順番に出力すると実行結果のようになります。
正規表現 まとめ
Javaの正規表現について以下説明しました。
・正規表現について
・正規表現に使う記号の種類と記載ルール
・Matcherクラスの便利なメソッド
・Patternクラスの便利なメソッド
正規表現を使えば、ユーザーが任意で登録したデータの中身を
正確にチェックすることができるようになります。
複雑な登録処理を実現する為には必須の構文になるのでぜひマスターしましょう!