2013-04-05 46 views
0

我正在写一个正则表达式来匹配数字序列,接着是一个点,然后是另一个数字序列,并且在总长度上(包括点),整个序列应该是13。为此,我写的正则表达式是:(\d{6,12})\.(\d{0,6})(?<=.{13})使用正向逆序的意外正则表达式行为

当我对以下两个数据样本运行此表达式时,我期待着只有第二个匹配,但相反,两者都是匹配的。任何人都可以帮我理解为什么?

  • 1234567.123456>匹配,但我期待它不匹配;
  • 1234567.12345>匹配。

这里是我用来测试的Java代码: import java.util.regex.Pattern;

public class App { 
    public static void main(String[] args) { 
     Pattern matcher = Pattern.compile("(\\d{6,12})\\.(\\d{0,6})(?<=.{13})"); 
     System.out.println(matcher.matcher("1234567.123456").matches()); 
     System.out.println(matcher.matcher("1234567.12345").matches()); 
    } 
} 

输出:

true 
true 

回答

2

您需要将向后断言锚定在字符串的开头,或将匹配的子字符串:

Pattern matcher = Pattern.compile("(\\d{6,12})\\.(\\d{0,6})(?<=^.{13})"); 

或者使用前向断言,而不是(更容易理解,IMO):

Pattern matcher = Pattern.compile("(?=.{13}$)(\\d{6,12})\\.(\\d{0,6})"); 
2

您需要使用锚匹配字符串的开头:

"(\\d{6,12})\\.(\\d{0,6})(?<=^.{13})" 
1

您可能需要一个锚(^)添加到您的回顾后表示:

(?<=^.{13})