Java - 模式匹配但无法捕获

时间:2016-02-10 15:56:12

标签: java regex

以下是我的数据集中的三个示例行:

|   |   |   |   featureB >= 16104.33 : 18873.52 (1/0)

|   featureA >= 17980.32

featureC = ABC BLAH BLAH blA'H $blah 4/ blah blah

我正在努力想出一个可以捕获以下内容的模式匹配器:

  • 功能名称
  • 关系(=,> =,<)
  • 特征值(可以是数字和/或字符的混合,但从不包含冒号)
  • 结果(冒号之后和括号之前的值 - 冒号和结果是可选的,可能不会出现在某些行上)

我提出了以下模式,但无法捕获特征值:

Pattern.compile("(?:\\|   )*(.*?)(>?=|<)((?!:).)*(?::?)(.*?)(?:\\(.*\\))?")

所以基本上我的目标是group(1)包含要素名称,group(2)包含关系,group(3)包含要素值,group(4)包含结果如果存在。

目前group(1)group(2),group(4)会产生我所期待的内容,但group(3)永远不会被捕获,并且始终为空。

我将不胜感激任何帮助/建议。

3 个答案:

答案 0 :(得分:3)

根据您精心设计的要求,我想出了这个正则表达式来捕获所有4组(第4组是可选的):

^[ |]*(\w+)\s*(>?=|<)\s*([^:]+)(?:\s*:\s*([^()]*))?

Java模式:

Pattern p = Patttern.compile("^[ |]*(\\w+)\\s*(>?=|<)\\s*([^:]+)(?:\\s*:\\s*([^(]+))?.*$");

RegEx Demo

答案 1 :(得分:2)

第5组是可选的括号内容。

^[ |]*(\w+)\s*(>?=|<)\s*([^:]+?)(?:\s*:\s*([^\(]+))?(\(.*)?$

参见示例@ https://regex101.com/r/bP6xJ4/1

答案 2 :(得分:1)

这似乎适用于您的所有输入:

argv[]

或者,在Java中

envp[]

(\s*\|\s*)*(\w+)\s*(<=?|>=?|=)([^:]+)(:(.*)$)? |--------| |---| |---------||-----||-|--|-| 1 2 3 4 5 6 是功能名称,Pattern.compile("(\\s*\\|\\s*)*(\\w+)\\s*(<=?|>=?|=)([^:]+)(:(.*)$)?"); 是运算符,group(2)是值,group(3)是结果。

这是测试正则表达式的绝佳资源:

http://www.regexplanet.com/advanced/java/index.html