【Java】正規表現でマッチした文字列の位置と長さを取得する方法
Javaで正規表現によるマッチングを行う際、「どの位置でマッチしたのか」「マッチした文字列は何文字なのか」を知りたいケースはよくあります。java.util.regex.Matcherクラスには、こうした情報を取得するための便利なメソッドが用意されています。
start()メソッドとend()メソッド
start()メソッドは、マッチが成立した場合に、その開始位置(インデックス)を返します。同様に、end()メソッドは、マッチの終了位置を返します。
したがって、以下のようにマッチ情報を求めることができます。
- マッチの開始位置:start()メソッドの戻り値
- マッチした文字列の長さ:end()とstart()の戻り値の差
なお、これらのメソッドはマッチがまだ行われていない状態で呼び出すとIllegalStateExceptionがスローされるため、必ずfind()やmatches()などでマッチ処理を実行してから呼び出してください。
サンプルコード
次の例では、ユーザーが入力したテキストから数字の連続(\d+)を検索し、最後にマッチした位置と長さを出力します。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherExample {
public static void main(String[] args) {
int start = 0, len = -1;
Scanner sc = new Scanner(System.in);
System.out.println("入力テキストを入力してください: ");
String input = sc.nextLine();
String regex = "\\d+";
// Patternオブジェクトを作成
Pattern pattern = Pattern.compile(regex);
// コンパイル済みパターンを対象文字列に適用
Matcher matcher = pattern.matcher(input);
// マッチする限り繰り返し処理
while (matcher.find()) {
start = matcher.start(); // 開始位置を取得
len = matcher.end() - start; // 終了位置との差が長さ
}
System.out.println("マッチした位置 : " + start);
System.out.println("マッチした長さ : " + len);
}
}
実行結果
入力テキスト: digitsを含むサンプルデータ 12345 マッチした位置 : 24 マッチした長さ : 5
この例では、入力文字列の中で「12345」がインデックス24の位置から始まり、5文字分マッチしていることがわかります。
複数のマッチに対応するポイント
whileループ内でfind()を繰り返し呼び出すことで、文字列中のすべてのマッチを順番に処理できます。上記のサンプルでは変数を上書きしているため最後のマッチ結果だけが残りますが、ループ内でリストに追加すれば、すべてのマッチ位置と長さを記録することも可能です。
また、Matcherクラスにはグループ単位で位置を取得できるstart(int group)やend(int group)といったオーバーロード版も存在するため、キャプチャグループを使ったより高度な解析にも対応できます。
-
Java正規表現(Regex)で固定文字セットにマッチさせる方法
Javaの正規表現における文字クラスを使うと、あらかじめ定義しておいた固定の文字集合の中から「任意の1文字」にマッチさせることができます。たとえば、次のように記述します。 [tmp]:t、m、p のいずれか1文字にマッチします。 [^tp]:t と p 以外の任意の1文字にマッチします(先頭に ^ を付けると否定を意味します)。 角括弧 [ ] 内に候補となる文字を列挙すると、入力文字列の各位置についてその中のどれか1つが存在すればマッチが成立します。この仕組みを利用すると、「特定の文字が文字列内に何回出現するか」を簡単に数えることができます。 例1:指定した文字の出現回数をカウントする
-
Javaのlengthとlength()の違いを徹底解説!正しい使い分けのポイント
Javaには、配列のサイズを取得するlengthと、文字列の長さを取得するlength()という、名前がよく似た2つの仕組みが存在します。初心者の方は混同しがちですが、この2つは本質的に異なるものです。lengthは配列のインスタンス変数(フィールド)である一方、length()はStringクラスのメソッドです。それぞれの特徴と使い方を詳しく見ていきましょう。 length:配列の長さを表すフィールド 配列はオブジェクトであり、同じ型の値を固定された個数だけ格納します。 配列のlength変数は配列の長さ、すなわち配列に格納されている要素数を返します。 配列は一度初期化するとその長さを後か