有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

---: 
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']
  ]
]

可以使用(See on regex101)检索单个记录属性:

([A-Z0-9 ]{3,3}): ([0-9SW]+ )?([0-9\.SW]{3,})\n

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

这是如何正确完成的


共 (1) 个答案

  1. # 1 楼答案

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

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

     -:\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
     -
    

    如果我们猜错了会有什么后果?在出现错误的情况下继续下去有什么好处吗?这完全取决于你的申请