gpt4 book ai didi

java - 如何用 Java 编写这个 .NET 正则表达式组捕获操作?

转载 作者:行者123 更新时间:2023-12-01 14:44:16 24 4
gpt4 key购买 nike

在 .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 完成相同的任务,而无需重新编写正则表达式或使用外部库吗?

最佳答案

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

重复示例:

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

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

c3null

Without:

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

打印:

a1b2c3

关于java - 如何用 Java 编写这个 .NET 正则表达式组捕获操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com