1

私のサンプルコード:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    /**
     * @param args
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String str[] = {"A","B","C"};
        String s = "TEST FOR A STRING CONSTANT B. END.";
        int retIndex = -1;

        for (int i = 0, len = str.length; i < len; i++){ 
            //length-1 is because, we should not check the empty space unicode(\u0021)

            int index = s.lastIndexOf(str[i]);
            if(index>retIndex){
                retIndex = index;
            }
        }
        System.out.println("RETINDEX"+retIndex);

        Pattern pattern = Pattern.compile("A|B|C");
        Matcher m = pattern.matcher(s);

        while(m.find()){
            retIndex = m.start();
            System.out.println(m.group()+" : "+m.end()+" : "+m.start());
        }

        System.out.println("REGEX RETINDEX"+retIndex);
    }
}

そして、私は出力を得ました:

RETINDEX27
A : 10 : 9
C : 19 : 18
A : 24 : 23
B : 28 : 27
REGEX RETINDEX27

最大インデックス出力のみが必要です。他の 3 つのループを実行する必要はありません。私の必要に応じて上記のものを変更するにはどうすればよいですか?. 正確に lastindexOf 正規表現と一致します。

ありがとう

4

1 に答える 1

9

正規表現の最後の出現を見つけるには、その前のすべてに貪欲な一致を記述します。次に例を示します。

.*(A|B|C)

テスト文字列.*を指定すると、最後の B までのすべてが一致し、キャプチャ グループから B を取得できます。

intキャプチャ グループにアクセスするには、引数を取るメソッドを使用します。

    Pattern pattern = Pattern.compile(".*(A|B|C)");
    Matcher m = pattern.matcher(s);
    if (m.find()) {
        retIndex = m.start(1);
        System.out.println(m.group(1)+" : "+m.end(1)+" : "+m.start(1));
    }
于 2013-09-30T06:34:21.723 に答える