1. 導入
Javaで文字列操作を行う際、正規表現は避けて通れない強力な武器です。しかし、Patternクラスには似たようなメソッドが多く、どれをいつ使うべきか迷うことはありませんか?適切なメソッドを選択することは、コードの可読性を高めるだけでなく、メモリ効率やパフォーマンスの最適化にも直結します。今回は、現場で頻出するPatternクラスの主要メソッドを整理して解説します。
2. 基礎知識
Javaの正規表現は、主にjava.util.regex.Patternとjava.util.regex.Matcherの2つのクラスで構成されます。
・Pattern: 正規表現の「コンパイル済み」の表現。
・Matcher: 特定の入力文字列に対して、Patternを使って照合を行うエンジン。
正規表現を扱う際は、まず文字列をパターンとしてコンパイルしてから利用するのが基本です。
3. 実装/解決策
それぞれのメソッドの使い分けは以下の通りです。
・Pattern.matches(): 文字列全体がパターンと一致するかを確認します。単発のチェックに便利ですが、何度も繰り返す場合は非効率です。
・Pattern.matcher(): Matcherオブジェクトを取得し、複雑な検索や置換、位置情報の取得を行います。
・Pattern.split() / splitAsStream(): 特定の区切り文字(正規表現)で文字列を分割します。特にsplitAsStream()はJava 8以降で導入され、Stream APIとの相性が抜群です。
・Pattern.quote(): 正規表現で特別な意味を持つ記号(.やなど)を「ただの文字」として扱いたい場合に、エスケープ処理を自動で行います。
4. サンプルプログラム
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class RegexExample {
public static void main(String[] args) {
String text = “Java:Python:C++”;
// 1. splitAsStream: ストリームとして分割して処理する
System.out.println(“— splitAsStreamの例 —“);
Pattern.compile(“:”).splitAsStream(text).forEach(System.out::println);
// 2. quote: 特殊文字をリテラルとして扱う
String input = “price.is.100”;
// ドットは正規表現で「任意の1文字」を意味するため、quoteでエスケープする
String regex = Pattern.quote(“.”);
String[] parts = input.split(regex);
System.out.println(“\n— quoteの例 —“);
for (String p : parts) System.out.println(p);
// 3. matcher: 名前付きグループ(Named groups)の利用
// (?<名前>…) という形式でグループに名前を付けられる
String date = “2023-10-25”;
Pattern p = Pattern.compile(“(?
var matcher = p.matcher(date);
if (matcher.matches()) {
System.out.println(“\n— 名前付きグループの例 —“);
System.out.println(“年: ” + matcher.group(“year”));
System.out.println(“月: ” + matcher.group(“month”));
}
}
}
5. 応用・注意点
現場で最も注意すべきは「コンパイルの再利用」です。メソッド内で毎回 Pattern.compile() を呼ぶと、その都度正規表現の解析が行われ、パフォーマンスが著しく低下します。固定の正規表現は、必ず static final フィールドとして定義し、使い回すようにしてください。
また、名前付きグループは非常に便利ですが、複雑な正規表現になると読み解くのが困難になります。ロジックが複雑になる場合は、正規表現に頼りすぎず、文字列のサブストリング操作や外部ライブラリの利用も検討しましょう。安全で保守性の高いコードを書くことが、シニアエンジニアへの第一歩です。

コメント