Java 6正则表达式是一组的多个匹配项

时间:2011-08-27 14:09:46

标签: java regex

这是一个简单的模式:[key]: [value1] [value2] [value3] [valueN]

我想得到:

  1. key
  2. 值数组
  3. 这是我的正则表达式:^([^:]+):(:? ([^ ]+))++$

    以下是我的文字:foo: a b c d

    Matcher为我提供了两组:foo(作为键)和d(作为值)。

    如果我使用+?代替++,我会a,而不是d

    因此,java会在第一次(或最后一次)发生组返回。

    我在这里不能使用find()因为只有一个匹配。

    除了将正则表达式分成两部分并使用find作为值数组之外,我该怎么办? 我在许多其他环境中使用正则表达式,几乎所有环境都能够获取“第一次出现第1组”,“第二次出现第1组”等等。

    如何在JDK6中使用java.util.regex

    感谢。

2 个答案:

答案 0 :(得分:9)

匹配组的总数不依赖于目标字符串(在您的情况下为"foo: a b c d"),而是依赖于模式。您的模式将始终包含3个组:

^([^:]+):(:? ([^ ]+))++$
 ^       ^   ^
 |       |   |
 1       2   3

1 st 组将保留您的密钥,而2 nd 组与组3相同但后面包含一个空格,将始终保持你的一个价值观。这是第一个值(在不合格+?的情况下)或最后一个值(在贪婪匹配的情况下)。

你能做的就是匹配:

^([^:]+):\s*(.*)$

以便您拥有以下匹配项:

- group(1) = "foo"
- group(2) = "a b c d"

然后在它的空格上拆分2 nd 组以获取所有值:

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main (String[] args) throws Exception {
    Matcher m = Pattern.compile("^([^:]+):\\s*(.*)$").matcher("foo: a b c d");
    if(m.find()) {
      String key = m.group(1);
      String[] values = m.group(2).split("\\s+");
      System.out.printf("key=%s, values=%s", key, Arrays.toString(values));
    }
  }
}

将打印:

key=foo, values=[a, b, c, d]

答案 1 :(得分:2)

Scanner s = new Scanner(input).useDelimiter(Pattern.compile(":?\\s+"));
String key = s.next();
ArrayList values = new ArrayList();
while (s.hasNext()) {
    values.add(s.next());
}
System.out.printf("key=%s, values=%s", key, values);

打印:

key=foo, values=[a, b, c, d]