Java 解析文本的最快/最简单方法

Java 解析文本的最快/最简单方法,java,text-parsing,Java,Text Parsing,我正在尝试解析一些文本,我正在寻找最快/最简单的解决方案。我尝试过使用正则表达式,但是用Java要花很长时间 以下是我试图解析的文本结构: ***************** ID: 1234567 // 7 digit uuid mistakes: There may be some mistakes here, or there may not be any mistakes //optional mistake type: mistake background // "YES" or

我正在尝试解析一些文本,我正在寻找最快/最简单的解决方案。我尝试过使用正则表达式,但是用Java要花很长时间

以下是我试图解析的文本结构:

*****************
ID: 1234567  // 7 digit uuid
mistakes: There may be some mistakes here, or there may not be any mistakes  //optional
mistake type: mistake background // "YES" or "NO"
report: <xml><item>blah, blah</item></xml> 

*****************
*****************
ID:1234567//7位uuid
错误:这里可能有一些错误,或者可能没有任何错误//可选
错误类型:错误背景/“是”或“否”
报告:废话,废话
*****************
实际上,文件可能看起来是这样的:

*****************
ID: 1234567
mistakes: 
NO: happened on the playground
report: <xml><item>black eye when playing basketball</item><reason>elbow</reason></xml> 

*****************

*****************
ID: 1234568
mistakes: Teacher was not watching students at the time of incident
YES: teacher turned her back after seeing an altercation
report: <xml><item>fight</item><reason>None</reason></xml> 

*****************

*****************
ID: 1234569
mistakes:
NO
report: <xml><item>Child needed band-aid</item><reason>scrape</reason></xml> 

*****************

*****************
ID: 1234570
mistakes:
NO
report: <xml><item>Child needed tissue</item><reason>runny nose</reason></xml> 

*****************
...
...
*****************
身份证号码:1234567
错误:
不是:发生在操场上
报告:打篮球时眼睛发黑
*****************
*****************
身份证号码:1234568
错误:事件发生时,老师没有观察学生
是的:老师看到一场争吵后就把她拒之门外
报告:fightNone
*****************
*****************
身份证号码:1234569
错误:
不
报告:儿童需要创可贴
*****************
*****************
身份证号码:1234570
错误:
不
报告:儿童需要组织,流鼻涕
*****************
...
...
我正在尝试将“键”(ID、错误、错误类型、报告)放入
映射中,以便进一步汇总和处理

我尝试过使用regex,但收效甚微,但客户端不断更改报告结构,并放弃了整个模式。我正在寻找一些可能更容易维护的东西。在过去,我很容易对这样的数据进行xsl转换,但是这不是纯xml,我不知道Java是否会使用当前格式。我问过客户是否愿意更改格式,但他们对此不感兴趣

有人对如何使这种解析更容易维护有什么想法吗

谢谢


编辑:

我没有带正则表达式,但这里是它的要点


ID:\s*(\\d{7})。*错误:\s*(\\d*).*错误类型:\s*(\\d*).*报告:\s*(*)
我还不能对帖子发表评论,这就是为什么我将此作为答案。如果您有固定数量的字段,则可以逐行读取,并且在行开始后仅写入6行(“^\.*”)。然后,您将继续使用类似的逻辑将它们存储在地图中。如果它以“^errors:”)开始,则将剥离“^errors”后剩下的内容存储为值。

如果您使用的是java,为什么不尝试将此文件作为属性文件加载。然后,您可以使用propFile.getProperty(“key”)来读取它。这样,您可能不需要映射,或者即使需要映射,也可以使用propFile.propertyNames()使用枚举并将其放置在映射中。

您可以尝试使用常规字符串操作。例如,对于包含

身份证号码:1234567

差不多

if (line.startsWith("ID:")
{
    String id = line.subString(3).trim();
}
显然,事先检查该行是否为空/空。我相当肯定它会更快


另请参阅这篇博文

我想我将继续使用带有readline twist的正则表达式


我会将我的正则表达式更改为“\\*{17}.\\*{17}”
,一旦我将它们按“*”分组,我就可以逐行读取它们,并根据它们的ID将它们放入我的地图中。

好吧,正则表达式必须非常简单地描述这种格式,每当格式发生变化时更新它们可能没什么大不了的,它会引起很多头痛。它似乎总是打破一些东西,我花了几天的谷歌搜索等,以找出为什么格式不应该改变这么频繁的第一位。。。我们能看一些代码吗?不要同意一个正则表达式。该文件遵循您应该遵循的严格结构。至少对于最后一个(报告),您应该单独解析为xml。只需在需要这种结构的行中穿行,并在运行时中断星号填充对象列表。@Vedran我已经在分析报告了。我试图把重点放在“挑选关键点”(ID、错误、错误类型、报告)上。这个想法的问题是,根据这个例子,相同的键值在一个文件中多次出现。我有200多个这样的“组”需要解析。我不想逐行解析它们。对不起,没有看到代码,我以为正在使用BufferedReader。如果将整个文件读入内存,我仍然看不到使用regex的原因,因为项标识符是静态的。如果标识符类似于ID1:,ID2,etcIf,我通常使用正则表达式。如果您不建议使用正则表达式,您会推荐什么?@Dan:我使用这种类型的操作解析了数千行的文件。我不认为它花了超过2秒来解析。“你确定你负担不起使用这种方法吗?”Dan在我的回答中经常进行字符串比较。