Java 正则表达式:获取嵌套重复组

Java 正则表达式:获取嵌套重复组,java,regex,regex-greedy,Java,Regex,Regex Greedy,如何在重复组中匹配重复组 例如,获取日志文件中的所有有效记录: ---: TS : 150602000006S EC1: 02429.523 EC2: 05604.110 --- ---: TS : 150603000006S ---: TS : 150603000006S EP1: 3333.523 --- 如以下匹配: [ [ ['TS ', '150602000006S'], ['EC1', '02429.523'], ['EC2', '05604.

如何在重复组中匹配重复组

例如,获取日志文件中的所有有效记录:

---: 
TS : 150602000006S
EC1: 02429.523
EC2: 05604.110
---
---: 
TS : 150603000006S
---: 
TS : 150603000006S
EP1: 3333.523
---
如以下匹配:

[ 
  [
    ['TS ', '150602000006S'], 
    ['EC1', '02429.523'],
    ['EC2', '05604.110']
  ], 
  [
    ['TS', '150603000006S'], 
    ['EP1', '3333.523']
  ]
]
可以使用()检索单个记录属性:

但是,在记录组()中放置正则表达式时,属性组会以重复方式停止匹配


这是如何正确完成的

为了保持它的可维护性,我将尝试将其拆分为几个正则表达式

首先,您需要进行一些基本检查,以确保数据的格式符合您的期望。我将计算以下每个表达式出现的次数。如果他们不匹配,那么干脆放弃*

---:\n
---(\n|$)
一旦知道它们相等,您可能希望将整个字符串与模式匹配,以将其分成多个部分,例如

---:\n.*?---(\n|$)
这表示一个文本
--:
后跟一个换行符,后跟尽可能少的文本(
*?
是惰性的),后跟一个换行符或字符串的结尾。您需要使用ssingle line标志运行此操作

这将为您的示例字符串提供三个匹配项。然后,您可以在每个结果匹配上运行您的模式


*放弃似乎是一条简单的出路,但很难对格式错误的数据做出准确的猜测。考虑到您前面的示例,如果我们希望将此数据标准化,我们有两种选择,都添加为注释:

---:
TS : 150602000006S
EC1: 02429.523
EC2: 05604.110
---
---:
TS : 150603000006S
       // Add a closing tag here?
---:   // Remove this opening tag?
TS : 150603000006S
EP1: 3333.523
---

如果我们猜错了会有什么后果?在出现错误的情况下继续下去有什么好处吗?这完全取决于您的应用程序。

可能不适用于正则表达式…@Mena为什么不可能?我并不是说绝对不可能,但一般来说,正则表达式有助于解析文本,而不是根据给定语法进行上下文分析(例如,针对标记的正则表达式通常是一个非常糟糕的主意)。当您有嵌套元素和嵌套规则时,正则表达式很快就会变得非常麻烦。假设您找到了匹配分层记录的正确方法,那么表达式本身将很长,很可能无法读取,并且很难维护。通常,您会希望为此实现自己的解析器。我同意将正则表达式分为两部分。这与单个记录匹配,但是,它不处理无效记录。有正则表达式解决这个问题吗?@JasperJ我已经修改了我的答案。希望能有帮助。
---:
TS : 150602000006S
EC1: 02429.523
EC2: 05604.110
---
---:
TS : 150603000006S
       // Add a closing tag here?
---:   // Remove this opening tag?
TS : 150603000006S
EP1: 3333.523
---