Javaの正規表現

正規表現とは

生徒
生徒

教授?
正規表現って何ですか?

教授
教授

正規表現とは、文字列のパターンを一つの形式でまとめて表現するために使うものです。
Javaでは、java.util.regexパッケージに正規表現を扱うためのクラスが用意されていますよ?

記号意味
.任意の一文字
*直前の文字の0回以上の繰り返し
+直前の文字の1回以上の繰り返し
?直前の文字の0回か1回
[XYZ]XYZいずれか一文字
[^XYZ]XYZ以外の一文字
[X-Z]XからZまでの範囲で一文字
正規表現の記号や範囲

Javaの正規表現

生徒
生徒

実際のJavaのコードはどんな感じですか?

教授
教授

まずPatternクラスでパターンをコンパイルし、次にMatcherクラスで文字列とマッチさせます。
例えば、次のコードは「a*b」というパターンに「aaaaab」という文字列がマッチするかどうかを判定します。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexExample {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("a*b"); // パターンをコンパイル
    Matcher m = p.matcher("aaaaab"); // 文字列とマッチさせる
    boolean b = m.matches(); // マッチしたかどうかをbooleanで返す
    System.out.println(b); // true
  }
}
生徒
生徒

*(アスタリスク)が直前の文字「a」の0回以上の繰り返しという意味なのですね。

教授
教授

そんな感じです。

正規表現のメタキャラクタ

教授
教授

正規表現について、他にも例を挙げてみましょう。

//電話番号の形式(例:03-1234-5678)にマッチする正規表現
Pattern p = Pattern.compile("\\d{2,4}-\\d{2,4}-\\d{4}");

//メールアドレスの形式(例:test@example.com)にマッチする正規表現
Pattern p = Pattern.compile("[\\w\\.\\-]+@[\\w\\.\\-]+\\.[A-Za-z]+");

//HTMLタグ(例:<p>)にマッチする正規表現
Pattern p = Pattern.compile("<[^>]+>");
生徒
生徒

また、よくわからない記号が出てきましたね。

教授
教授

メタキャラクタというものになりますよ?

記号意味
\d数字
\w英数字
\s空白文字
.ピリオドそのもの
+直前の文字の1回以上の繰り返し
*直前の文字の0回以上の繰り返し
?直前の文字の0回か1回
{n}直前の文字のn回
{n,m}直前の文字のn回からm回まで
[ ]括弧内のいずれか一文字
[^ ]括弧内以外の一文字
^行頭
$行末
メタキャラクタ
教授
教授

正規表現は、文字列を検索したり置換したりするときに便利です。
Javaでは、Matcherクラスに検索や置換に関するメソッドが用意されています。
例えば、次のコードは「a*b」というパターンにマッチする部分を「X」に置換しますよ?

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexExample {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("a*b"); // パターンをコンパイル
    Matcher m = p.matcher("aabaaab"); // 文字列とマッチさせる
    String s = m.replaceAll("X"); // マッチした部分をXに置換
    System.out.println(s); // XaX
  }
}
生徒
生徒

へぇー。
なんとなく分かりました。

教授
教授

なるほど。
君の正規表現にはマッチしなかったようですね?

タイトルとURLをコピーしました