Java 在已知值之前分组多个数字
我正在执行这个正则表达式代码,期望分组值为11,但得到的却是1。分组似乎包含正确的正则表达式,用于在已知值之前获取一个或多个数字。我相信这很简单,但我似乎无法理解Java 在已知值之前分组多个数字,java,regex,Java,Regex,我正在执行这个正则表达式代码,期望分组值为11,但得到的却是1。分组似乎包含正确的正则表达式,用于在已知值之前获取一个或多个数字。我相信这很简单,但我似乎无法理解 String mydata = "P0Y0M0W0DT11H0M0S"; Pattern pattern = Pattern.compile("P.*(\\\\d+)H.*"); Matcher matcher = pattern.matcher(mydata); if (matcher.find()){ System.out
String mydata = "P0Y0M0W0DT11H0M0S";
Pattern pattern = Pattern.compile("P.*(\\\\d+)H.*");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find()){
System.out.println(matcher.group(1));
}
试试这个
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
问题是,
*
在检查下一个零件之前,将尝试使用/匹配尽可能多的零件。因此,在正则表达式P.*(\d+)H.*
中,第一个*
将匹配0Y0M0W0DT1
,因为这是与之后仍然能够匹配单个数字的组匹配的最大值
如果您使该量词懒惰/不情愿(即*?
),它将尝试尽可能少地匹配可能匹配的0Y0M0W0DT1
和0Y0M0W0DT
,它将选择较短的一个,并保留所有数字供组匹配
因此,regexp.*(\d+)H.*
应该执行您想要的操作
附加说明:由于使用的是
Matcher#find()
,因此不需要在末尾使用catch-all表达式*
。它还将匹配任何包含字符H
的字符串,该字符前面至少有一个数字,这些数字前面的某个地方有一个P
。因此,如果你想更严格地限制你的正则表达式,你就需要对其进行增强。也许你所需要的只是一个打字错误?应该是\\d+
。请参阅。是的,这是一个输入错误。感谢您澄清解决方案。