正则表达式匹配固定位置的缺失组

regex to match absent groups at fixed locations

需要一个始终匹配(与 matches(),而不是 find())并且始终识别 3 组的正则表达式,用于 3 种不同的输入情况,例如

  1. 1234 ab$.5!c=:d6 efg(789)
  2. 1234 EFG(567)
  3. efg(567)

模式

(?:^(\d+)\s+(\S)\s)?\s*([^\(]+\(\S+\))

表示每个组中预期的值类型(不假设字符的位置),但仅在情况 #1 中正确工作,产生

1234, ab$.5!c:d6, efg(789)

对于情况2和3,同样的模式不起作用,分别给出

null, null, ab$.5!c:d6 efg(789)
null, null, efg(789)

有什么想法吗?

您可以使用下面的正则表达式。

^(?:(\d+)\s+(?:(\S+)\s)?)?([^(]+\([^)]*\))$

DEMO

String s = "1234 efg(567)";
Matcher m = Pattern.compile("^(?:(\d+)\s+(?:(\S+)\s)?)?([^(]+\([^)]*\))$").matcher(s);
while(m.find()) {
    if(m.group(1) != null)
        System.out.println(m.group(1));
    if(m.group(2) != null)
        System.out.println(m.group(2));
    if(m.group(3) != null)
        System.out.println(m.group(3));
}