在已知值之前对多个数字进行分组

时间:2015-11-13 15:05:55

标签: java regex

我正在执行此正则表达式代码,期望分组值为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));
}

2 个答案:

答案 0 :(得分:2)

试试这个

tenantid

输出

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));
        }

    }

答案 1 :(得分:2)

问题是.*会在检查下一部分之前尝试尽可能多地使用/匹配。因此,在您的正则表达式P.*(\d+)H.*中,第一个.*将匹配0Y0M0W0DT1,因为它可以与之后仍然能够匹配单个数字的组匹配。

如果你使量化器懒惰/不情愿(即.*?),它会尝试匹配尽可能 little ,以便匹配0Y0M0W0DT1和{{1}它将选择较短的一个并保留组的所有数字以匹配。

因此正则表达式0Y0M0W0DT应该做你想要的。

附加说明:由于您正在使用P.*?(\d+)H.*,因此您最终不需要使用catch-all-expression Matcher#find()。它还匹配任何包含字符.*的字符串,前面至少有一个数字,并且在这些数字前面的某个位置H。因此,如果您想要更具限制性,则需要增强正则表达式。