Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在已知值之前分组多个数字_Java_Regex - Fatal编程技术网

Java 在已知值之前分组多个数字

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

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

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
,它将选择较短的一个,并保留所有数字供组匹配

因此,regex
p.*(\d+)H.*
应该执行您想要的操作


附加说明:由于使用的是
Matcher#find()
,因此不需要在末尾使用catch-all表达式
*
。它还将匹配任何包含字符
H
的字符串,该字符前面至少有一个数字,这些数字前面的某个地方有一个
P
。因此,如果你想更严格地限制你的正则表达式,你就需要对其进行增强。

也许你所需要的只是一个打字错误?应该是
\\d+
。请参阅。是的,这是一个输入错误。感谢您澄清解决方案。