最近の質問で述べたように、問題を再現するには - (.*)* が 2 つの一致を作成し、グループ $1 で何も選択しないのはなぜですか? *と+、括弧の内側と外側のさまざまな組み合わせを試してみましたが、得られた結果は期待どおりではありませんでした。
その質問の受け入れられた回答で説明されているものと同じ出力を期待していたPerlでしょう。. しかし、同じように振る舞うわけではありません。
簡単にするために、私が試したコードは次のとおりです。
String str = "input";
String[] patterns = { "(.*)*", "(.*)+", "(.+)*", "(.+)+" };
for (String pattern: patterns) {
Matcher matcher = Pattern.compile(pattern).matcher(str);
while (matcher.find()) {
System.out.print("'" + matcher.group(1) + "' : '" + matcher.start() + "'" + "\t");
}
System.out.println();
}
そして、これは私が4つの組み合わせすべてに対して得た出力です: -
'' : '0' '' : '5' // For `(.*)*`
'' : '0' '' : '5' // For `(.*)+`
'input' : '0' 'null' : '5' // For `(.+)*`
'input' : '0' // For `(.+)+`
さて、私が理解できないのは、なぜ in1stと2ndoutput で、 のように文字列全体を取得していないのかということfirst resultですmatcher.find()。つまり、理想的には、最初のケースで.*は、最初に文字列全体をキャプチャしてから、最後に もキャプチャする必要がありempty stringます。現在、第 2 試合では期待どおりの結果が得られていますが、 ではうまく動作していません1st match。
+また、2 番目のケースでは、ブラケットの外側に量指定子があるため、2 番目の一致を取得することさえできません。
私の予想される出力は次のとおりです。
'input' : '0' '' : '5' // For 1st
'input' : '0' // For 2nd
また、3rd出力で、なぜnull代わりに 2 番目の一致が得られたのempty stringですか? 最初の 3 つの組み合わせの 2 番目の一致は同じであるべきではありませんか?
4番目の出力は予想どおりです。ですから、間違いありません。