17

Matcher と Pattern クラスの小さなスタブをテストしています...次の小さなスタブを参照してください..

package scjp2.escape.sequence.examples;

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

public class Sample_19 {

    public static void main(String a[]){
        String stream = "ab34ef";
        Pattern pattern = Pattern.compile("\\d*");

        //HERE * IS GREEDY QUANTIFIER THAT LOOKS FOR ZERO TO MANY COMBINATION THAT 
        //START WITH NUMBER 
        Matcher matcher = pattern.matcher(stream);

        while(matcher.find()){
            System.out.print(matcher.start()+matcher.group());
        }
    }

}

ここで...比較する文字列は「ab34ef」です。これは長さ 6 です。

いいえ、繰り返しを見てみましょう...


反復 NO matcher.start() matcher.group()

1 0 ""

2 1 ""

3 2 34

4 4 ""

5 5 ""

ここで..結合...matcher.start() + matcher.group()....計算による出力は次のとおりです:0123445

ただし、スタブは 01234456 を生成します。

「6」がどこから来ているのか理解できません。文字列インデックスはゼロから始まるため、ここでは最大インデックスが 5 になる可能性があります。6 はどこから来るのでしょうか??

ループを6回繰り返します..どのように?なにか提案を ?

4

2 に答える 2

15

正規表現は 0 文字と一致する可能性があります。最終的な一致は、インデックス 5 の文字の、文字列の末尾にあるゼロ幅の文字列です。したがって、このゼロ幅の文字列のインデックスは 6 です。


余談ですが、セパレーターを使用して出力を読みやすくすると、何が起こっているのかを理解しやすくなる場合があります。

System.out.println(matcher.start()+ ": " + matcher.group());

結果:

0: 
1: 
2: 34
4: 
5: 
6: 

イデオン

于 2012-06-23T17:16:27.403 に答える
10

あなたの表現*は0以上の数字を意味するので、どの数字とも一致しません。

この方法で正規表現を変更します

Pattern pattern = Pattern.compile("\\d+");

使用+とは、1 つ以上を意味します。

于 2012-06-23T17:28:38.273 に答える