1

java.util.Scannerを使用して、大きな文字列から特定の正規表現のすべての出現箇所をスキャンしています。

Scanner sc = new Scanner(body);
sc.useDelimiter("");
String match = "";
while(match!=null)
{
    match = sc.findWithinHorizon(pattern, 0);
    if(match==null)break;
    MatchResult mr = sc.match();
    System.out.println("Match string: "+mr.group());
    System.out.println("Match string using indexes: "+body.substring(mr.start(),mr.end());
}

奇妙なことに、特定の回数のスキャンの後、group()メソッドは正しいオカレンスを返しますが、start()メソッドとend()メソッドは、スキャンがファイルの先頭から再開したように間違ったインデックスを返します。正規表現は複数行です(この正規表現を使用して、行の変更 "\ r \ n | [\ n \ r \ u2028 \ u2029 \ u0085]"を検出します)。

ヒントはありますか?それは「horizo​​n」パラメーターに関連している可能性がありますか(私はその値に対して異なる組み合わせを試しました)?

詳細については、ファイルのサイズ(1000文字以上)に関連しているようです。約1000の後、カウンターは0から再開します(たとえば、1003:1020以降の最初の誤ったインデックスの発生は3:120になります)。

4

1 に答える 1

4

Scanner文字付きの内部バッファを使用し1024ます。Pattern代わりに使用してください:

Matcher matcher = Pattern.compile(...).matcher(body);
while(matcher.find()) {
    int start = matcher.start();
}
于 2012-09-13T08:09:29.007 に答える