相同的正则表达式在Java和Python中有不同的结果

相同的正则表达式在Java和Python中有不同的结果,java,python,regex,Java,Python,Regex,Java代码: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegExpTest { public static void main(String[] args) { String str = "X-Value = -0.525108, Y-Value = 7.746691, Z-Value = 5.863008, Timestamp(milliseconds

Java代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExpTest {
    public static void main(String[] args) {

        String str = "X-Value = -0.525108, Y-Value = 7.746691, Z-Value = 5.863008, Timestamp(milliseconds) = 23001";
        String p = "Value = (.*?), ";
        Pattern pattern = Pattern.compile(p);
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()){
             System.out.println(matcher.group(1));
             System.out.println(matcher.group(2));
             System.out.println(matcher.group(3));
        }
    }
}
Java代码的输出:

$ java RegExpTest 
-0.525108
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 2
        at java.util.regex.Matcher.group(Matcher.java:487)
        at RegExpTest.main(RegExpTest.java:15)
$ 
Python代码(在解释器中):


那么,为什么Java无法匹配匹配的所有匹配项呢?

因为你用错了

matcher.group()。您只有一个捕获组(即模式中的一组括号)

matcher.find()
是返回下一个匹配项(如果您重复调用它)的方法。通常在while循环中,例如:

    while (matcher.find()){
         System.out.println(matcher.group(1));
    }

查看更多。

这是因为java匹配的组是一个捕获括号

您的正则表达式只有一组非转义(即捕获)括号,即
(.*)

组1包含匹配的值

没有第2组,因为正则表达式中没有第二组括号

在java示例中,您希望遍历所有匹配项,并打印
matcher.group(1)


请注意
while
,它将遍历所有匹配项,并从每个匹配项中告诉您组1。

Java的
Java.util.regex.Matcher.find
尝试查找下一个匹配的值,而不是所有匹配的值。将
if
更改为
while
,您应该会得到您想要的结果

...
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(1));
...
while ( matcher.find() ) {
    System.out.println(matcher.group(1));
}
...
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(1));
...