Java 6正则表达式一个组的多个匹配项
下面是简单的模式:Java 6正则表达式一个组的多个匹配项,java,regex,Java,Regex,下面是简单的模式:[key]:[value1][value2][value3][valueN] 我想得到: 钥匙 值数组 这是我的正则表达式:^([^:]+):(:?([^]+)++$ 这是我的文字:foo:abcdc Matcher为我提供了两个组:foo(作为键)和d(作为值) 如果我使用+?而不是+我得到的是a,而不是d 所以java返回组的第一次(或最后一次)出现 我不能在这里使用find(),因为这里只有一个匹配项 除了将正则表达式拆分为两部分并对值数组使用find之外,我还能做什么?
[key]:[value1][value2][value3][valueN]
我想得到:
^([^:]+):(:?([^]+)++$
这是我的文字:foo:abcdc
Matcher
为我提供了两个组:foo
(作为键)和d
(作为值)
如果我使用+?
而不是+
我得到的是a
,而不是d
所以java返回组的第一次(或最后一次)出现
我不能在这里使用find()
,因为这里只有一个匹配项
除了将正则表达式拆分为两部分并对值数组使用find之外,我还能做什么?
我在许多其他环境中使用过正则表达式,几乎所有的正则表达式都能够获取“组1的第一次出现”、“组1的第二次出现”等等
如何在JDK6中使用java.util.regex
谢谢。匹配组的总数不取决于目标字符串(
“foo:a b c d”
,在您的情况下),而是取决于模式。您的模式将始终有3个组:
^([^:]+):(:? ([^ ]+))++$
^ ^ ^
| | |
1 2 3
第一组将保存您的密钥,第二组(与第3组相同,但随后包含一个空格)将始终只保存您的一个值。这是第一个值(在ungreedy+?
的情况下)或最后一个值(在贪婪匹配的情况下)
您可以做的只是匹配:
^([^:]+):\s*(.*)$
这样您就有了以下匹配项:
- group(1) = "foo"
- group(2) = "a b c d"
然后在第二组的空白处拆分,以获得所有值:
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]
它打印:
key=foo, values=[a, b, c, d]
你能澄清一下关于“只有一个匹配”的观点吗?没有办法像你所问的那样捕获不确定数量的匹配,因此这里需要一些迭代。现在已经是2013年了,这个问题仍然没有像样的解决方案!facepalmOne,我想她指的是
(?:
而不是(:?
)。但更重要的是,这确实需要一点。我相信C#有一种方法可以做到这一点。扩展API可能很有用,这样就可以检索N的匹配数组ᵗʰgroup viagroup_array(N)
或诸如此类;您需要一个新的模式编译标志来启用它,因为它对于一般使用来说太昂贵了。在Perl中,可以使用数组@1
和@2
而不是标量$1
和$2
,甚至定义$1
的意思是$1[$1]
等等。这是有用的,邪恶的,还是两者兼而有之?:)@tchrist,是的,你可能对:?
?:
。我不太熟悉C,也从来没有听说过这种N分组功能(你有链接到MSDN文档吗?)。它肯定既有用又邪恶!:)是什么让我污染了自己?:)在捕获集合和捕获下。不过,我读起来有点困难。:)是否有其他引擎允许捕获所有重复的组匹配?因为如果我在正则表达式上进行正则表达式匹配,那就太过分了results@Uko,我不知道。当然,你可以随意提出一个新问题。
key=foo, values=[a, b, c, d]