相同的正则表达式在Java和Python中有不同的结果
Java代码:相同的正则表达式在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
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));
...