我正在使用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]”)。
你有任何提示吗?它可能与“horizon”参数有关(我尝试过该值的差异组合)?
有关更多详细信息,它似乎与文件的维度(超过1000个字符)相关,在大约1000之后计数器从0重新启动(例如,在1003:1020之后第一个错误的索引发生变为3:120)。
答案 0 :(得分:4)
Scanner
使用带有1024
个字符的内部缓冲区。请改用Pattern
:
Matcher matcher = Pattern.compile(...).matcher(body);
while(matcher.find()) {
int start = matcher.start();
}