2013-04-05 51 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})