2012-07-13 81 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)$