我正在执行此正则表达式代码,期望分组值为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));
}
答案 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
。因此,如果您想要更具限制性,则需要增强正则表达式。