0

在 .NET 中,如果我想将字符序列与描述捕获组发生任意次数的模式匹配,我可以编写如下内容:

String input = "a, bc, def, hijk";
String pattern = "(?<x>[^,]*)(,\\s*(?<y>[^,]*))*";

Match m = Regex.Match(input, pattern);
Console.WriteLine(m.Groups["x"].Value);

//the group "y" occurs 0 or more times per match
foreach (Capture c in m.Groups["y"].Captures)
{
    Console.WriteLine(c.Value);
}

此代码将打印:

a
bc
def
hijk

这看起来很简单,但不幸的是,下面的 Java 代码并没有像 .NET 代码那样做。(这是意料之中的,因为 java.util.regex 似乎没有区分组和捕获。)

String input = "a, bc, def, hijk";
Pattern pattern = Pattern.compile("(?<x>[^,]*)(,\\s*(?<y>[^,]*))*");

Matcher m = pattern.matcher(input);

while(m.find())
{
     System.out.println(m.group("x"));
     System.out.println(m.group("y"));
}

印刷:

a
hijk

null

有人可以解释如何使用 Java 来完成相同的任务,而无需重新编写正则表达式或使用外部库吗?

4

2 回答 2

1

你想要的在java中是不可能的。当同一个组被多次匹配时,只保存该组的最后一次出现。有关更多信息,请阅读 Pattern 文档部分Groups and capture。在java中,Matcher/Pattern用于String“实时”迭代 a 。

重复示例:

String input = "a1b2c3";
Pattern pattern = Pattern.compile("(?<x>.\\d)*");
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
     System.out.println(matcher.group("x"));
}

打印(null,因为 * 也匹配空字符串):

c3
无效的

没有:

String input = "a1b2c3";
Pattern pattern = Pattern.compile("(?<x>.\\d)");
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
     System.out.println(matcher.group("x"));
}

印刷:

a1
b2
c3
于 2013-03-25T01:05:40.573 回答
0

您可以在 Java 中使用 Pattern 和 Matcher 类。略有不同。例如下面的代码:

Pattern p = Pattern.compile("(el).*(wo)");
Matcher m = p.matcher("hello world");
while(m.find()) {
  for(int i=1; i<=m.groupCount(); ++i) System.out.println(m.group(i));
}

将打印两个字符串:

el
wo
于 2013-03-25T01:14:23.900 回答