这是事情: 我有一个非常大的文本文件,它有这样的格式:
0007476|000011434982|00249626000|R|2008-01-11 00:00:00|9999-12-31 23:59:59|000019.99
0007476|000014017887|00313865000|R|2011-04-19 00:00:00|9999-12-31 23:59:59|000599.99
...
...
我需要查找文件中是否存在特定模式,比如说
0007476|whatever|00313865000|whatever
我需要的只是一个布尔表示是或否。 现在我所做的是逐行读取文件并进行正则表达式匹配:
Pattern pattern = Pattern.compile(regex);
Scanner scanner = new Scanner(new File(fileName));
String line;
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (pattern.matcher(line).matches()) {
scanner.close();
return true;
}
}
并且正则表达式具有
的形式"0007476\|\d{12}\|0031386500.*
此方法有效,但搜索远离起始行的字符串通常需要15秒。有没有更快的方法来实现这一目标?感谢
答案 0 :(得分:1)
java String class有一个contains方法,它返回一个布尔值。如果您的字符串是固定的,这比正则表达式要快得多:
if (string.contains("0007476|") && string.contains("|00313865000|")) {
// whatever
}
希望有帮助,如果没有,请发表评论。
答案 1 :(得分:1)
我认为您需要Scanner
,因为该文件太大而无法读入单个String
?
如果不这种情况,您可以使用直接找到匹配项的正则表达式。根据您是否关心行开头的特定文本,您可以使用以下内容:
"(?m)^0007476\|\d{12}\|0031386500.*$
如果由于内存使用需要将其分解为较小的块,我建议不要逐行读取(因为行很短),但是使用像{{1}这样的东西来处理更大的块而不是?
我用一个1.25GB的文件摆弄了一下,以下是你的实现速度的2.5倍:
BufferedReader