Java java.util.regex.MatchResult与Scanner的计数器问题

时间:2012-09-13 08:04:57

标签: java java.util.scanner

我正在使用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 \ u \ u2028 \ u2029 \ u0085]”)。

你有任何提示吗?它可能与“horizo​​n”参数有关(我尝试过该值的差异组合)?

有关更多详细信息,它似乎与文件的维度(超过1000个字符)相关,在大约1000之后计数器从0重新启动(例如,在1003:1020之后第一个错误的索引发生变为3:120)。

1 个答案:

答案 0 :(得分:4)

Scanner使用带有1024个字符的内部缓冲区。请改用Pattern

Matcher matcher = Pattern.compile(...).matcher(body);
while(matcher.find()) {
    int start = matcher.start();
}