这是简单的模式: [key]: [value1] [value2] [value3] [valueN]
我想得到:
- 键
- 价值数组
这是我的正则表达式: ^([^:]+):(:? ([^ ]+))++$
这是我的文字: foo: a b c d
Matcher
给了我两组: foo
(作为关键)和 d
(作为价值观)。
如果我使用 +?
代替 ++
我明白了 a
不是 d
。
所以java返回第一个(或最后一个)组的出现。
我不能用 find()
因为这里只有 一 比赛。
除了将正则表达式分成两部分并使用find作为值数组之外,我该怎么办?
我在许多其他环境中使用正则表达式,几乎所有环境都能够获取“第一次出现第1组”,“第二次出现第1组”等等。
我该怎么办? java.util.regex
在JDK6?
谢谢。
匹配组的总数不依赖于目标字符串("foo: a b c d"
,在你的情况下),但在模式上。您的模式将始终包含3个组:
^([^:]+):(:? ([^ ]+))++$
^ ^ ^
| | |
1 2 3
1ST 小组会拿着你的钥匙,2ND group,与第3组匹配,但随后包含一个空格,将始终仅包含1个值。这是第一个值(如果是不合适的话 +?
)或最后一个值(在贪婪匹配的情况下)。
你能做的就是匹配:
^([^:]+):\s*(.*)$
这样你就有了以下比赛:
- group(1) = "foo"
- group(2) = "a b c d"
然后拆分2ND 在它的空白区域上获取所有值:
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]
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]