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

Ily*_*a.K 11 java regex

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

我想得到:

  1. 价值数组

这是我的正则表达式: ^([^:]+):(:? ([^ ]+))++$

这是我的文字: foo: a b c d

Matcher给了我两组:( foo作为关键)和d(作为值).

如果我使用+?而不是++我得到a,不是d.

所以java返回第一个(或最后一个)组的出现.

我不能find()在这里使用因为只有一场比赛.

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

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

谢谢.

Bar*_*ers 9

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

^([^:]+):(:? ([^ ]+))++$
 ^       ^   ^
 |       |   |
 1       2   3
Run Code Online (Sandbox Code Playgroud)

在1 集团将持有你的钥匙,和2 组,它匹配相同的组3,但随后包括空格,将总是抱着只是你的价值观1.这是第一个值(在不合格的情况下+?)或最后一个值(在贪婪匹配的情况下).

你能做的就是匹配:

^([^:]+):\s*(.*)$
Run Code Online (Sandbox Code Playgroud)

这样你就有了以下比赛:

- group(1) = "foo"
- group(2) = "a b c d"
Run Code Online (Sandbox Code Playgroud)

然后在它的空白区域拆分第二组以获取所有值:

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));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

将打印:

key=foo, values=[a, b, c, d]
Run Code Online (Sandbox Code Playgroud)