【问题标题】:Parsing flat file with repeating section using regex使用正则表达式解析带有重复部分的平面文件
【发布时间】:2016-11-28 11:57:15
【问题描述】:

我有一个包含以下格式数据的平面文件:

1:00 PM
Name                UniqueID 
ABX 298819 12       519440AD3

12:00 AM
Name                UniqueID 
AX1 239949 01       119440AD3

每个部分都以时间开头,然后是标题,然后是值。我正在尝试通过正则表达式捕获这些部分中的每一个,所以我可以得到:

section 1:
1:00 PM
Name                UniqueID 
ABX 298819 12       519440AD3

section 2:
12:00 AM
Name                UniqueID 
AX1 239949 01       119440AD3

然后将这些部分中的每一个解析为 java 类对象,如下所示:

public class Section {
    String timestamp;
    List<Row> rows;
}

public class Row {
    String name;
    String uniqueId;
}

但我无法提取两个正则表达式匹配之间的“文本”。下面是我试过的正则表达式:

((1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm))(?=.*)

但它只返回时间值:

10:30 AM
1:00 PM
1:30 PM
10:30 AM
1:00 PM
1:30 PM

我什至尝试将Pattern.MULTILINE 添加到Pattern,但也没有用。

【问题讨论】:

  • 你想提取什么?
  • 试试这个:(\d+):(\d+)\s(PM|AM)\s*Name\s*UniqueID\s*(\w.*?)\s(\d+)\s+(\d+)\s+([\d\w]+) 你只需要全局启用。顺便说一句,您要确切地说什么?尝试使用 regexr.com 之类的正则表达式可视化工具
  • 我已经更新了问题

标签: java regex


【解决方案1】:

假设您向我们展示的结构在整个文件中重复,那么依次有四种类型的行:时间戳、标题、数据、空行。

例如,如果您想将唯一 ID 与名称分开,您可以尝试:

String third = "ABX 298819 12       519440AD3";
String uniqueId = third.replaceAll(".*\\s+(\\w+)", "$1");
String name = third.replaceAll("(.*)\\s+\\w+", "$1");

【讨论】:

  • “我认为你可以不用正则表达式来处理这个问题。” 但是你仍在使用正则表达式,只是不是很大。
  • @LakatosGyula 我想在发布之前删除它,抱歉。我的观点很简单,我认为解析文本是这里的主力,只是撒了一点正则表达式让它变得有趣。
猜你喜欢
  • 2010-12-13
  • 2019-08-24
  • 2019-10-31
  • 2015-01-29
  • 2015-07-16
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多