将多个数字分组以前的已知值

3

我正在执行这个正则表达式代码,期望获得一个组值为11,但是却得到了1。似乎该分组包含了正确的正则表达式,可以获取已知值之前的一个或多个数字。我确定这很简单,但我似乎无法解决它。

String mydata = "P0Y0M0W0DT11H0M0S";
Pattern pattern = Pattern.compile("P.*(\\\\d+)H.*");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find()){
    System.out.println(matcher.group(1));
}

也许你所需要的只是Pattern.compile("(\\d+)H"); - Wiktor Stribiżew
\\\\d+ 是一个打字错误吗?应该是 \\d+ - Tunaki
请见此篇文章 - Wiktor Stribiżew
是的,那是一个打字错误。 - jim stone
2个回答

2

试试这个

public static void main(String a1[]) {
        String mydata = "P0Y0M0W0DT11H0M0S";
        Pattern pattern = Pattern.compile("P.*?(\\d+)H.*");
        Matcher matcher = pattern.matcher(mydata);
        if (matcher.find()){
            System.out.println(matcher.group(1));
        }

    }

输出

11

2
问题在于.*会尽可能多地匹配/消耗,在下一个部分被检查之前。因此,在您的正则表达式P.*(\d+)H.*中,第一个.*将匹配0Y0M0W0DT1,因为这是可以与组仍然能够匹配单个数字之后匹配的最多内容。
如果您将该量词设置为懒惰/不情愿(即.*?),它将尝试尽可能少地匹配,因此在可能的匹配0Y0M0W0DT10Y0M0W0DT中,它将选择更短的那个,并将所有数字留给组进行匹配。
因此,正则表达式P.*?(\d+)H.*应该符合您的要求。
附加说明:由于您正在使用Matcher#find(),因此您不需要在末尾使用通配符表达式.*。它也会匹配任何包含至少一个数字和一个P字符的字符串,后面跟着字符H。因此,如果您想更加严格,请增强您的正则表达式。

感谢您澄清解决方案。 - jim stone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接