2012-02-12 11 views
0

Java代码的不同的结果:相同的正则表达式在Java和Python

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代码(在翻译):

>>> 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'] 
>>> 

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

回答

7

这是因为用于java匹配的是捕获括号。

您的正则表达式只有一组非易失性(即捕获)括号,(.*?)

组1包含匹配的值。

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

在java示例中,您想遍历所有匹配项和print matcher.group(1)

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

注意while,这将遍历所有的比赛,并告诉你,1组从每个。

+0

我很蠢。谢谢。 – yetanotherstacker 2012-02-12 23:26:11

0

因为你用错了。

matcher.group()在单个匹配内返回各个捕获组的值。您只有一个捕获组(即模式中的一组括号)。

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

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

查看更多here

2

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

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