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

yet*_*ker 0 python java 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) = 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
$ 
Run Code Online (Sandbox Code Playgroud)

Python代码(在Interpreter中):

>>> import re
>>> re.findall("Value = (.*?), ", 'X-Value = -0.525108, Y-Value = 7.746691, Z-Value = 5.863008, Timestamp(milliseconds) = 23001;')
['-0.525108', '7.746691', '5.863008']
>>> 
Run Code Online (Sandbox Code Playgroud)

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

mat*_*fee 7

这是因为java匹配的是捕获括号.

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

第1组包含匹配的值.

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

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

while ( matcher.find() ) {
    System.out.println(matcher.group(1));
}
Run Code Online (Sandbox Code Playgroud)

注意while,它将循环遍历所有匹配并告诉您每个匹配的组1.