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

时间:2015-04-24 01:40:57

标签: java regex pattern-matching matching regex-group

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

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

    (?:^(\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)
    

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

^(?:(\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));
}