広告

Java : MatchResult (正規表現) - API使用例

MatchResult (Java SE 22 & JDK 22) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
API仕様書のおともにどうぞ。


概要

マッチ操作の結果。

クラス構成

MatchResultインタフェースは、Matcher による正規表現のマッチ操作の結果を表します。

関連記事 : 正規表現の基本

final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc 345");

final var stream = matcher.results();

stream.forEach(matchResult -> {

    System.out.println("------");
    System.out.println("start : " + matchResult.start());
    System.out.println("end : " + matchResult.end());
    System.out.println("group : " + matchResult.group());
});

// 結果
// ↓
//------
//start : 0
//end : 3
//group : abc
//------
//start : 8
//end : 14
//group : aaaabc

メソッド

int end ()

最後にマッチした文字の後のオフセットを返します。

final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc");

System.out.println(matcher.lookingAt()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 3
System.out.println(matchResult.group()); // "abc"
final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc 345");

final var stream = matcher.results();

stream.forEach(matchResult -> {

    System.out.println("------");
    System.out.println("start : " + matchResult.start());
    System.out.println("end : " + matchResult.end());
    System.out.println("group : " + matchResult.group());
});

// 結果
// ↓
//------
//start : 0
//end : 3
//group : abc
//------
//start : 8
//end : 14
//group : aaaabc

int end (int group)

このマッチ操作中に指定されたグループによって前方参照された部分シーケンスの、最終文字の後のオフセットを返します。

final var pattern = Pattern.compile("(abc|efg)_012_(x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

final var groupCount = matchResult.groupCount();
System.out.println(groupCount); // 2

for (int i = 1; i <= groupCount; i++) {

    System.out.println("------");
    System.out.println("i : " + i);
    System.out.println("start : " + matchResult.start(i));
    System.out.println("end : " + matchResult.end(i));
    System.out.println("group : " + matchResult.group(i));
}

// 結果
// ↓
//------
//i : 1
//start : 0
//end : 3
//group : abc
//------
//i : 2
//start : 8
//end : 11
//group : xyz

default int end (String name)

前回のマッチ操作で、指定された名前付きの前方参照を行う正規表現グループによって前方参照された部分シーケンスの、最後の文字の後のオフセットを返します。

final var pattern = Pattern.compile("(?<A>abc|efg)_012_(?<B>x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();
System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

{
    final var name = "A";

    System.out.println(matchResult.start(name)); // 0
    System.out.println(matchResult.end(name)); // 3
    System.out.println(matchResult.group(name)); // "abc"
}

{
    final var name = "B";

    System.out.println(matchResult.start(name)); // 8
    System.out.println(matchResult.end(name)); // 11
    System.out.println(matchResult.group(name)); // "xyz"
}

String group ()

前回のマッチで一致した入力部分シーケンスを返します。

final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc");

System.out.println(matcher.lookingAt()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 3
System.out.println(matchResult.group()); // "abc"
final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc 345");

final var stream = matcher.results();

stream.forEach(matchResult -> {

    System.out.println("------");
    System.out.println("start : " + matchResult.start());
    System.out.println("end : " + matchResult.end());
    System.out.println("group : " + matchResult.group());
});

// 結果
// ↓
//------
//start : 0
//end : 3
//group : abc
//------
//start : 8
//end : 14
//group : aaaabc

String group (int group)

前回のマッチ操作で指定されたグループによって前方参照された入力部分シーケンスを返します。

final var pattern = Pattern.compile("(abc|efg)_012_(x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

final var groupCount = matchResult.groupCount();
System.out.println(groupCount); // 2

for (int i = 1; i <= groupCount; i++) {

    System.out.println("------");
    System.out.println("i : " + i);
    System.out.println("start : " + matchResult.start(i));
    System.out.println("end : " + matchResult.end(i));
    System.out.println("group : " + matchResult.group(i));
}

// 結果
// ↓
//------
//i : 1
//start : 0
//end : 3
//group : abc
//------
//i : 2
//start : 8
//end : 11
//group : xyz

default String group (String name)

前回のマッチ操作で指定された名前付きの前方参照を行うグループによって前方参照された入力部分シーケンスを返します。

final var pattern = Pattern.compile("(?<A>abc|efg)_012_(?<B>x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();
System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

{
    final var name = "A";

    System.out.println(matchResult.start(name)); // 0
    System.out.println(matchResult.end(name)); // 3
    System.out.println(matchResult.group(name)); // "abc"
}

{
    final var name = "B";

    System.out.println(matchResult.start(name)); // 8
    System.out.println(matchResult.end(name)); // 11
    System.out.println(matchResult.group(name)); // "xyz"
}

int groupCount ()

このマッチ結果のパターンに指定されている、前方参照を行う正規表現グループの数を返します。

final var pattern = Pattern.compile("(abc|efg)_012_(x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

final var groupCount = matchResult.groupCount();
System.out.println(groupCount); // 2

for (int i = 1; i <= groupCount; i++) {

    System.out.println("------");
    System.out.println("i : " + i);
    System.out.println("start : " + matchResult.start(i));
    System.out.println("end : " + matchResult.end(i));
    System.out.println("group : " + matchResult.group(i));
}

// 結果
// ↓
//------
//i : 1
//start : 0
//end : 3
//group : abc
//------
//i : 2
//start : 8
//end : 11
//group : xyz

default boolean hasMatch ()

thisに以前の一致または検索操作からの有効な一致が含まれているかどうかを返します。

final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaabc");

{
    System.out.println(matcher.find()); // true

    final var matchResult = matcher.toMatchResult();
    System.out.println(matchResult.hasMatch()); // true
    System.out.println(matchResult.start()); // 0
    System.out.println(matchResult.end()); // 3
    System.out.println(matchResult.group()); // "abc"
}

{
    System.out.println(matcher.find()); // true

    final var matchResult = matcher.toMatchResult();
    System.out.println(matchResult.hasMatch()); // true
    System.out.println(matchResult.start()); // 8
    System.out.println(matchResult.end()); // 13
    System.out.println(matchResult.group()); // "aaabc"
}

{
    System.out.println(matcher.find()); // false

    final var matchResult = matcher.toMatchResult();
    System.out.println(matchResult.hasMatch()); // false
}

default Map<String,Integer> namedGroups ()

キャプチャリング・グループ名からグループ番号への変更不可能なマップを返します。

final var pattern = Pattern.compile("(?<A>abc|efg)_012_(?<B>x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true
final var matchResult = matcher.toMatchResult();

System.out.println("-- groups --");
for (final var entry : matchResult.namedGroups().entrySet()) {
    System.out.println("entry : " + entry);

    final var num = entry.getValue();
    System.out.println("  group : " + matchResult.group(num));
}

// 結果
// ↓
//true
//-- groups --
//entry : A=1
//  group : abc
//entry : B=2
//  group : xyz

int start ()

マッチの開始インデックスを返します。

final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc");

System.out.println(matcher.lookingAt()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 3
System.out.println(matchResult.group()); // "abc"
final var pattern = Pattern.compile("a+bc");
final var matcher = pattern.matcher("abc 012 aaaabc 345");

final var stream = matcher.results();

stream.forEach(matchResult -> {

    System.out.println("------");
    System.out.println("start : " + matchResult.start());
    System.out.println("end : " + matchResult.end());
    System.out.println("group : " + matchResult.group());
});

// 結果
// ↓
//------
//start : 0
//end : 3
//group : abc
//------
//start : 8
//end : 14
//group : aaaabc

int start (int group)

このマッチ操作中に指定されたグループによって前方参照された部分シーケンスの、開始インデックスを返します。

final var pattern = Pattern.compile("(abc|efg)_012_(x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();

System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

final var groupCount = matchResult.groupCount();
System.out.println(groupCount); // 2

for (int i = 1; i <= groupCount; i++) {

    System.out.println("------");
    System.out.println("i : " + i);
    System.out.println("start : " + matchResult.start(i));
    System.out.println("end : " + matchResult.end(i));
    System.out.println("group : " + matchResult.group(i));
}

// 結果
// ↓
//------
//i : 1
//start : 0
//end : 3
//group : abc
//------
//i : 2
//start : 8
//end : 11
//group : xyz

default int start (String name)

前回のマッチ操作で指定された名前付き前方参照グループによって前方参照された部分シーケンスの開始インデックスを返します。

final var pattern = Pattern.compile("(?<A>abc|efg)_012_(?<B>x..)");
final var matcher = pattern.matcher("abc_012_xyz");

System.out.println(matcher.matches()); // true

final var matchResult = matcher.toMatchResult();
System.out.println(matchResult.start()); // 0
System.out.println(matchResult.end()); // 11
System.out.println(matchResult.group()); // "abc_012_xyz"

{
    final var name = "A";

    System.out.println(matchResult.start(name)); // 0
    System.out.println(matchResult.end(name)); // 3
    System.out.println(matchResult.group(name)); // "abc"
}

{
    final var name = "B";

    System.out.println(matchResult.start(name)); // 8
    System.out.println(matchResult.end(name)); // 11
    System.out.println(matchResult.group(name)); // "xyz"
}

関連記事

ページの先頭へ