我一直试图找出我的java程序的正则表达式验证,它将允许以下货币值" 1"," 1.00"," .1& #34;,或" 1。"但不是一个小数"。"。
小数点前后的数字(如果存在)可以是任意长度。
我拥有的是
(([\d]*\.)?[\d]*)
但是它允许在它之前或之后没有任何数字的单个小数。
答案 0 :(得分:1)
它应该有用。
\d+\.?\d*|\d*\.?\d+
使用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;
}
}
这并不能完全回答您的问题,但可能仍会对您有所帮助。