【Java】正規表現に一致したすべての文字列をリストとして取得する方法
Javaの標準APIには、正規表現に一致したすべての文字列を一括で取得するメソッドは用意されていません。そのため、ArrayListなどのリストを用意し、whileループの中でMatcher#find()によって一致を順番に検出しながら、group()で取り出した結果をリストへ追加していくのが定番の手法です。
実装例
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ListOfMatches {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("入力テキストを入力してください: ");
String input = sc.nextLine();
String regex = "\\d+";
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
ArrayList<String> list = new ArrayList<>();
// コンパイル済みパターンと入力文字列のマッチング
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
list.add(matcher.group());
}
Iterator<String> it = list.iterator();
System.out.println("一致した文字列のリスト: ");
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
実行結果
入力テキストを入力してください: sample 1432 text 53 with 363 numbers 一致した文字列のリスト: 1432 53 363
コードのポイント
- Pattern.compile(regex):正規表現文字列(ここでは「\d+」=1桁以上の数字)から
Patternオブジェクトを生成します。 - pattern.matcher(input):対象となる入力文字列に対する
Matcherを取得します。 - matcher.find():次の一致箇所を順番に検索し、見つかれば
trueを返します。ループと組み合わせることで全一致を走査できます。 - matcher.group():現在一致している部分文字列を返します。これをリストに追加していきます。
補足:Java 9以降ならresults()メソッドも利用可能
Java 9以降では、Matcher#results()を使うことで一致結果をStream<MatchResult>として取得でき、より簡潔に記述できます。
List<String> list = matcher.results()
.map(MatchResult::group)
.collect(Collectors.toList());
この方法なら、明示的なwhileループやIteratorを書く必要がなく、フィルタリングや変換といった後続処理とも組み合わせやすくなります。
-
Java正規表現のサブ式(?>re)――バックトラックしない独立パターンの解説
Javaの正規表現におけるサブ式・メタ文字「(?>re)」は、バックトラック(後戻り)を行わない独立したパターンを表します。これは「原子グループ(atomic group)」とも呼ばれ、一度マッチに成功すると、その結果を確定してそれ以降のマッチ処理で再評価されません。バックトラックとは?通常、正規表現エンジンはパターン全体がマッチするように、部分的なマッチ結果を巻き戻して別の組み合わせを試す「バックトラック」を行います。しかし「(?>re)」で囲まれた部分は独立して扱われるため、内部でのマッチが確定した後に外側のパターンとの整合性が取れない場合でも、巻き戻しによる再試行が行われませ
-
【Java】正規表現のメタ文字\B(非単語境界)の使い方をサンプルコードで解説
Javaの正規表現におけるメタ文字「\B」は、単語境界以外の位置(非単語境界)にマッチします。この記事では、\Bの基本的な意味と、サンプルコードによる具体的な動作をわかりやすく解説します。 メタ文字\Bとは 正規表現の\bは「単語境界」、すなわち単語文字([a-zA-Z_0-9])とそれ以外の文字の境目にある位置にマッチします。\Bはその逆で、次のような単語境界になっていない位置にマッチします。 単語文字と単語文字の間(例:「ab」の「a」と「b」の間) 非単語文字と非単語文字の間(例:「!@」の「!」と「@」の間) また、\Bはゼロ幅アサーションと呼ばれる種類のパターンのため、マッチし