2012-07-13 59 views
2

我想獲得一個有效的正則表達式在Java(java.util.regex包),用於驗證以下格式來使用(= X):正則表達式不能得到特殊結構的工作

一個數字,具有最多15個數字,其中3個MAX位數可以是小數,它們通過隔板preceeded(,)

所以,有效將是:

123456789(15 digits, ok) 
123456789,1 

[編輯],這些也應該是有效的:

1234567890123,45 
123456789012,345 

到目前爲止我想出以下正則表達式模式:

Pattern = [0-9]{1,15}(\,[0-9]{1,3})? 

此檢查一個範圍爲1到15位,通過一個可選的分離器,隨後另一3位以下。但是,這並不檢查輸入的總長度。有了這個正則表達式,值123456789,123將是有效的。

所以,我想我會添加一個額外的表達式,檢查總長度,並使用「(?=」構建模擬的邏輯和行爲。

所以我開始將是我現有的正則表達式如下:?

Pattern = (?= [0-9]{1,15}(\,[0-9]{1,3})?) 

然而,這導致基本上一切,我扔在它失敗了,我不能讓它的工作進一步我沒有看到我在做什麼錯在這裏後一切正常,我想添加另一個表達式來檢查總長度,就像我想的那樣(?=。{16})。

回答

0

這對我有效。

boolean a = Pattern.matches("\\d{15}|\\d{12},\\d{3}", "123456789"); 
    System.out.println(a);//true 
    boolean b = Pattern.matches("\\d{15}|\\d{12},\\d{3}", "123456789012,345"); 
    System.out.println(b);//true 
    boolean c = Pattern.matches("\\d{15}|\\d{12},\\d{3}", "1234567890123,456"); 
    System.out.println(c);//false 

讓你的正則表達式是:

\d{15}|\d{12},\d{3} 
1

[編輯] 意識到你要接受16的總長度,如果有一個,,也即你並不真的需要在這裏使用lookaround,因爲你只有兩種情況。這只是正常:

public static boolean isValid(String input) { 
    return input.matches("^(\\d{0,15}|\\d{1,12},\\d{1,3})$"); 
} 

這將返回有效的,如果其中一個是真正的

  • 輸入由數字0-15或
  • 輸入包括1-12號,後面的一個,,接着1-3數字

[EDIT2]

好了,新的嘗試:

public static boolean isValid(String input) { 
    return input.matches("^(\\d{0,15}|(?=.{3,16})\\d+,\\d{1,3})$"); 
} 

這將返回有效的,如果其中一個是真正的

  • 輸入由數字0-15或
  • 輸入由3-16字符,由至少一個數字組成,後面跟着一個,,後跟1-3個數字
+0

編輯:好像我不是在我的描述不夠具體。我已經添加了一些可能有效的例子。 「問題」是可能少於3位數字,在這種情況下,數字之前的數字可能超過12個字符。 – Martijn 2012-07-13 10:21:39

+0

@Martijn:現在它適用於你所有的例子。 – Keppil 2012-07-13 10:27:03

0

試試這個正則表達式:由我

^\d{1,12}(?:\d{0,3}|\d{0,2},\d|\d{0,1},\d\d|,\d\d\d)$