私は昨年からこの質問を見ていました: Java Regex での長さゼロの一致:
Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("ababa");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
出力を生成します:
0[a]1
1[]1
2[a]3
3[]3
4[a]5
5[]5
これが正しいかどうか疑問に思っています。パターンは、「a」または空の文字列のいずれかに一致します。Matcher が最初の「b」を指している場合、「a」がないため、find() は空の文字列に一致します。
ただし、javadocには次のように記載されています。
このメソッドは、このマッチャーの領域の先頭から開始します。または、メソッドの以前の呼び出しが成功し、その後マッチャーがリセットされていない場合は、以前の一致で一致しなかった最初の文字から開始します。
そのため、Matcher が 'b' を指している場合、一致する文字はなく、find() は空の文字列と一致します。つまり、その後、前の一致で一致しなかった最初の文字 (つまり空の文字列) は引き続き 'b になります。 '。これは、上記に従って、次の find() が同じ場所で開始する必要があることを意味する必要があります。これは、コードが無限にループする必要があることを意味します。しかしもちろん、それは起こっていることではありません。空の文字列が一致すると、開始点が 1 つ上がるだけのようです。
元気?実装が間違っているのでしょうか、それとも javadoc で何かが省略されているのでしょうか?