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 回答