Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java正規表現の独占量指定子「X?+」メタ文字の使い方

Javaの正規表現における独占量指定子(Possessive Quantifier)X?+は、直前の要素Xが「1回だけ出現する」か「まったく出現しない」場合にマッチします。通常の量指定子「?」と似た働きをしますが、最大の特徴はバックトラック(巻き戻し)を行わないという点です。そのため、マッチング処理が高速になり、意図しないマッチの再試行を防ぐことができます。

動作のポイント

この例ではパターン「T?+」を使用しています。入力文字列内の各位置で、「T」があればそれにマッチし、なければ空文字列にマッチします。その結果、入力文字列のすべてのインデックス位置でマッチが検出されます。

サンプルコード

package com.tutorialspoint;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PossesiveQuantifierDemo {
    private static final String REGEX = "T?+";
    private static final String INPUT = "abcdTatW";

    public static void main(String[] args) {
        // パターンを生成
        Pattern pattern = Pattern.compile(REGEX);
        // マッチャーオブジェクトを取得
        Matcher matcher = pattern.matcher(INPUT);
        while(matcher.find()) {
            // マッチした開始インデックスを出力
            System.out.println("Match String start(): "+matcher.start());
        }
    }
}

実行結果

Match String start(): 0
Match String start(): 1
Match String start(): 2
Match String start(): 3
Match String start(): 4
Match String start(): 5
Match String start(): 6
Match String start(): 7
Match String start(): 8

結果の解説

入力文字列「abcdTatW」は9文字あるため、インデックス0〜8の各位置でマッチが発生しています。特に注目すべきはインデックス4で、ここでは実際に文字「T」にマッチしています。それ以外の位置では「T」が存在しないため、空文字列(長さ0のマッチ)としてマッチしています。このように、独占量指定子「?+」は「Xがあってもなくてもよい」という条件を、バックトラックなしで効率的に処理できる便利なメタ文字です。

  1. Javaの正規表現における$(ドル)メタ文字の使い方

    正規表現におけるサブ表現(メタ文字)「$」は、行の末尾に一致します。パターンの最後に「$」を置くことで、指定した文字列で終わるテキストだけをマッチさせることができます。なお、デフォルトでは「$」は入力全体の末尾に一致しますが、Pattern.MULTILINEフラグを有効にすると、行区切り文字(改行など)の直前にも一致するようになります。例1:行末の一致を確認する次のJavaプログラムでは、「Tutorialspoint」という文字列で終わる入力に対して、正規表現「Tutorialspoint$」が何回一致するかを数えています。import java.util.regex.Matcher; i

  2. Java正規表現のメタ文字「^(キャレット)」の使い方を解説

    正規表現におけるサブ式(メタ文字)「^」は、行の先頭にマッチします。この記号を正規表現の中で使用すると、入力文字列の中でその後に続くパターンが行頭から始まる場合に一致とみなされます。 例1:行頭のパターンにマッチするか確認する 次のサンプルコードでは、入力文字列が「Hi how are you」というフレーズで始まっているかどうかを「^」を使って判定しています。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void m