正则表达式允许1.00,.10或10.但不允许一个小数

时间:2014-07-17 15:07:01

标签: java regex validation pattern-matching match

我一直试图找出我的java程序的正则表达式验证,它将允许以下货币值" 1"," 1.00"," .1& #34;,或" 1。"但不是一个小数"。"。

小数点前后的数字(如果存在)可以是任意长度。

我拥有的是

(([\d]*\.)?[\d]*)

但是它允许在它之前或之后没有任何数字的单个小数。

3 个答案:

答案 0 :(得分:1)

它应该有用。

\d+\.?\d*|\d*\.?\d+

DEMO

使用String#matches()方法进行匹配。

示例代码:

String regex="\\d+\\.?\\d*|\\d*\\.?\\d+";

System.out.println("1".matches(regex));   // true
System.out.println("1.00".matches(regex));// true
System.out.println(".1".matches(regex));  // true
System.out.println("1.".matches(regex));  // true

System.out.println(".".matches(regex));   // false

答案 1 :(得分:1)

这个正则表达式可以满足您的需求:

(?!\.?$)\d*\.?\d*

它使用一个带有负向前视的简单模式来排除退化情况。

请参阅demo


Java代码演示:

for (String s : new String[] { "1", "1.", ".1", "111", ".", "foo" })
    System.out.format("%3s : %b\n", s, s.matches("(?!\\.?$)\\d*\\.?\\d*"));

输出:

  1 : true
 1. : true
 .1 : true
111 : true
  . : false
foo : false

关于表现出现了一个问题。好吧,使用蹩脚的旧笔记本,JVM预热,使用String#matches()是3微秒,重用编译的Pattern(即pattern.matcher(s).matches())是0.7微秒。

答案 2 :(得分:0)

另一个想法,取决于你在何处以及如何使用它,将是Double.parseDouble()并抓住NumberFormatException。这将允许您准确接受java可以使用的数字。

boolean isDecimal(String str) {
    try {
        Double.parseDouble(str);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

这并不能完全回答您的问题,但可能仍会对您有所帮助。