Java - 模式匹配但无法捕获

Rad*_*dix 6 java regex

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

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

|   featureA >= 17980.32

featureC = ABC BLAH BLAH blA'H $blah 4/ blah blah
Run Code Online (Sandbox Code Playgroud)

我试图想出一个模式匹配器,它将捕获以下内容:

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

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

Pattern.compile("(?:\\|   )*(.*?)(>?=|<)((?!:).)*(?::?)(.*?)(?:\\(.*\\))?")
Run Code Online (Sandbox Code Playgroud)

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

目前group(1),group(2),group(4)产生我期待但从group(3)未被捕获的东西,并且总是空的.

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

anu*_*ava 3

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

^[ |]*(\w+)\s*(>?=|<)\s*([^:]+)(?:\s*:\s*([^()]*))?
Run Code Online (Sandbox Code Playgroud)

Java模式:

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

正则表达式演示

  • 如果您使用“matches()”方法,则必须考虑整个字符串。他大概就是这个意思。只需在末尾添加“.*”即可。这意味着你也不需要 `(?m)^` 。 (2认同)