【发布时间】:2020-01-06 09:44:26
【问题描述】:
我需要以下的正则表达式:
- 小数点前8位
- 小数点后2位
\d{0,8}(\.\d{1,2})?$
这适用于上述情况,但我不希望接受以下字符串。字符串的结果不应为零。
- 0000.00 -> 错误
- 00.00 -> 错误
- 0.0 ->假
【问题讨论】:
标签: java regex validation pattern-matching
我需要以下的正则表达式:
\d{0,8}(\.\d{1,2})?$
这适用于上述情况,但我不希望接受以下字符串。字符串的结果不应为零。
【问题讨论】:
标签: java regex validation pattern-matching
另一种选择是断言不仅是点和零
^(?![0.]*$)\d{0,8}(?:\.\d{1,2})?$
在 Java 中
String regex = "^(?![0.]*$)\\d{0,8}(?:\\.\\d{1,2})?$";
如果你只想要一个匹配,你可以省略捕获组并使其不捕获(?:
【讨论】:
"(?=[1-9])(\\d{0,8}(\\.\\d{1,2})?)"
一个非零数字的前瞻就可以了。
【讨论】:
因为这是 java 并且您正在使用正则表达式来验证模式
^\d{0,8}(\.\d{1,2})?$
将获得一个最多包含两个可选小数的数字。
一旦你有了这个数字,你就可以把它解析成一个双精度数并检查它是否不等于 0。
String test = "100.00";
if (Pattern.compile("^\\d{0,8}(\\.\\d{1,2})?$").matcher(test).matches()) {
double val = Double.parseDouble(test);
if (val > 0) {
// do something
}
}
另一个选项是忘记正则表达式,解析它并检查它是否在您需要的范围内
final double maxVal = 99999999.99;
String test = "100.00";
try {
double val = Double.parseDouble(test);
if (val > 0 && val <= maxVal) {
int decimalIndex = test.indexOf(".");
if (decimalIndex >= 0) {
if (test.length() - decimalIndex - 1 <= 2) {
// do something, at most two deximals
}
} else {
// do something, no decinals
}
}
} catch (NumberFormatException e) {
// todo handle exception
}
【讨论】: