0

私はこの質問に本当に苦労しています:

import java.util.regex.*;    
class Regex2 {    
    public static void main(String[] args) {    
        Pattern p = Pattern.compile(args[0]);    
        Matcher m = p.matcher(args[1]);    
        boolean b = false;    
        while(b = m.find()) {    
            System.out.print(m.start() + m.group());    
        }    
    }
}  

上記のプログラムを次のコマンドで実行した場合:

java Regex2 "\d*" ab34ef 

を出力します01234456。私はこの出力を本当に理解していません。各文字について、次のインデックスを検討してください。

a b 3 4 e f
^ ^ ^ ^ ^ ^
0 1 2 3 4 5

出力されるべきではなかったの0123445ですか?

私はよく読んでいて、RegExエンジンも文字列の終わりを読み取るように見えますが、理解できません。誰かがその結果をどのように得ているかについてのステップバイステップガイドを提供できれば幸いです。つまり、それぞれの数字をどのように見つけているかです。

4

1 に答える 1

8

変更すると便利です

System.out.print(m.start() + m.group());

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

このようにして、出力ははるかに明確になります。

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

7つの異なる位置で一致していることがわかります。位置2では文字列「34」と一致し、他の位置では空の文字列と一致しました。空の文字列も最後に一致します。そのため、出力の最後に「6」が表示されます。

このようにプログラムを実行する場合は、次の点に注意してください。

java Regex2 "\d+" ab34ef

出力するだけです

2: 34
于 2011-12-18T18:30:48.613 に答える