JavaのMatcher.region(int start, int end)メソッドの使い方をサンプルコードで解説
Matcherクラスとregion()メソッドとは
java.util.regex.Matcherクラスは、正規表現によるさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってMatcherオブジェクトを取得します。
Matcherクラスのregion(int start, int end)メソッドは、入力文字列内の開始位置と終了位置を表す2つのint値を受け取り、現在のマッチャーに検索対象領域(リージョン)を設定します。リージョンを設定すると、以降のマッチ操作はその範囲内でのみ行われるようになります。デフォルトでは、リージョンは入力文字列全体に設定されています。
例1:find()と組み合わせてリージョンを設定する
次の例では、6〜10文字の英数字を受け付ける正規表現に対して、リージョンを先頭4文字に限定してマッチを試みます。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegionExample {
public static void main(String[] args) {
// 6〜10文字の単語構成文字を受け付ける正規表現
String regex = "\A(?=\w{6,10}\z)";
System.out.println("Enter 5 to 12 characters: ");
String input = new Scanner(System.in).next();
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの生成
Matcher matcher = pattern.matcher(input);
// 入力文字列に対してリージョン(0〜4)を設定
matcher.region(0, 4);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}実行結果
Enter 5 to 12 characters: sampleText Match not found
リージョンが先頭の4文字だけに制限されているため、「6〜10文字」という条件を満たすことができず、マッチは見つかりません。このように、region()メソッドを使うと入力文字列の一部だけを検証対象にできます。
例2:matches()と組み合わせてリージョンを設定する
次の例では、数字を含む文字列にマッチする正規表現に対して、リージョンを先頭20文字に設定しています。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegionExample {
public static void main(String[] args) {
String regex = "(.*)(\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers in between.";
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの生成
Matcher matcher = pattern.matcher(input);
// マッチャーのリージョンを先頭20文字に設定
matcher.region(0, 20);
if(matcher.matches()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}実行結果
Match not found
先頭20文字は「This is a sample Tex」であり、この範囲には数字が含まれていません。そのため、パターン中の(\d+)に対応する部分が存在せず、結果は「Match not found」となります。
region()メソッドを使う際のポイント
- デフォルトのリージョンは入力文字列全体であり、明示的に設定しない限り全範囲が検索対象になります。
- 現在設定されているリージョンは、regionStart()およびregionEnd()メソッドで確認できます。
- リージョンの境界をアンカー(\A、\zなど)や先読み・後読みが越えて参照できるかどうかは、useTransparentBounds()メソッドで切り替えられます。デフォルトでは不透明境界(opaque bounds)となっています。
-
JavaのPattern.matcher()メソッドの使い方を実例で解説
Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージに含まれるPatternクラスは、正規表現をコンパイルした結果を表すクラスです。このクラスが提供するmatcher()メソッドは、入力文字列を表すCharSequenceオブジェクトを引数として受け取り、現在のPatternオブジェクトが表す正規表現と入力文字列を照合するためのMatcherオブジェクトを返します。 matcher()メソッドの基本的な流れ matcher()メソッドを使った正規表現マッチングは、一般的に以下の手順で行い
-
JavaのMatcherクラスstart()メソッドとは?サンプルコード付きで解説
java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使用することで、Matcherオブジェクトを取得できます。 Matcherクラスのstart()メソッドは、直前にマッチした文字列の開始インデックス(先頭からの位置)をint型で返します。 start()メソッドの基本的な動作 正規表現における文字クラス「[...]」は、括弧内に指定したいずれか1文字に一致します。以下の例では、この文字クラ