Regex 使用模式匹配来解析一个大文件,但它似乎并不匹配文本中显示的每个案例

Regex 使用模式匹配来解析一个大文件,但它似乎并不匹配文本中显示的每个案例,regex,pattern-matching,fileparsing,Regex,Pattern Matching,Fileparsing,我试图解析一个非常结构化的大文件,并提取出我想要处理的信息,如行首的标记所示。我取出的物品的尺寸不够大,似乎有些物品被跳过了,但我不知道为什么。数据格式如下所示: 身份证号码:1 ASIN:0827229534 标题:布道模式:布道取样器 组别:书籍 销售排名:396585 类似:5 080421571516101074X 0687023955 0687074231 0827261919X 类别:2 |书籍[283155]|科目[1000]|宗教与灵性[22]|基督教[12290]|神职人员[1

我试图解析一个非常结构化的大文件,并提取出我想要处理的信息,如行首的标记所示。我取出的物品的尺寸不够大,似乎有些物品被跳过了,但我不知道为什么。数据格式如下所示:

身份证号码:1 ASIN:0827229534 标题:布道模式:布道取样器 组别:书籍 销售排名:396585 类似:5 080421571516101074X 0687023955 0687074231 0827261919X 类别:2 |书籍[283155]|科目[1000]|宗教与灵性[22]|基督教[12290]|神职人员[12360]12468] |书籍[283155]|科目[1000]|宗教与灵性[22]|基督教[12290]|神职人员[12360]12470] 评论:总计:2下载:2平均评级:5 更新:阅读:顾客:A2JW67OY8U6HHK评分:5票:10票:9票 2003年12月14日顾客:A2VE83MZF98支持率:5票:6票:5票

每个项目都列出了每个类别,即使该类别中没有类似的项目,例如:0有超过500000个Id号,但是当我模式匹配以查找Id时,仅报告约58000个Id。我只是寻找一个Id为的行,然后增加一个和。下面是简单的代码

import java.util.*;
import java.io.*;
import java.util.regex.*;

public class metaData4{
  public static void main(String[] args) throws Exception{
  File a = new File(args[0]);
  Scanner doc = new Scanner(a);
  String pattern = "Id.*";
  int sum = 0;
  while (doc.hasNextLine()){
   String data = doc.nextLine();
    if (data.matches(pattern)  ){
       sum++;
     }
   }
System.out.println(sum);
 }
}
我使用的数据链接警告这是一个大文本文件


编辑:为了使问题更清楚,我正在制作一个hasmap,其中键为ASIN,值为类似列表。ASIN和Id显示的次数相同,我使用Id作为模式匹配的线,因为出现的次数由下面的数字清楚地指示。运行前面的代码会在从上面的链接获取的较小文本文件上返回正确的Id出现次数,但在原始文件上则不正确。

这实际上与模式匹配无关。模式匹配按预期工作,但扫描仪有缺陷。或者至少是文本文件的编写,我发现了一个同样的事情发生的情况,问题的答案可以在这里找到:

因为前导。*,你的模式可以匹配一行中的ID。那是你想要的吗?事实上不,我不想要。Id每次都应该在行的开头,所以Id.*更正确,谢谢,我会编辑它。但是,这只会增加出现的次数,因此我感到困惑@1.618在这种情况下,您的模式应该是^Id:。^与行的开头匹配。我尝试了grep-G-c^Id:amazon-meta.txt,它返回了548552,这正是文件第2行的总数。似乎问题一定出在java.util.regex.*上,我以前从未使用过它。