【发布时间】:2017-04-07 09:32:01
【问题描述】:
我正在尝试检查数值是否具有特定数量的数字。
- 总位数不应超过 19 位
- 小数点前不得超过 17 位(整数部分)
- 小数点后不超过 4 位(小数部分)
- 可以有也可以没有小数点
- 前面可以有 + 或 - 或没有
有效示例:
- 1
- 1.0
- .0
- 12345678901234567.12
- +12345678901234567.12
- -12345678901234567.12
- 123456789012345.1234
- +123456789012345.1234
- -123456789012345.1234
无效示例
- 1234567890123456.1234 //因为有20位
- 123456789012345678.1 //因为小数点前多于17位
- 1.12345 //因为小数点后多于4位
我已经尝试了来自 this tutorial 的示例,但无法让它们按照我的意愿工作。我想我很难理解如何使用前瞻/环绕,因为这部分并不能真正做到我想要的:
@Test
public void testTutorialCode() {
//min two, max four digits for the whole expression
Pattern p = Pattern.compile("\\A(?=(?:[^0-9]*[0-9]){2,4})\\z");
assertFalse(p.matcher("+1234.0").matches());
assertTrue(p.matcher("12").matches());
assertTrue(p.matcher("12.12").matches());
assertTrue(p.matcher("+123.0").matches());
assertFalse(p.matcher("1234.0").matches());
}
【问题讨论】:
-
是否必须是正则表达式。通过循环遍历这些数字字符串的各个字符,这些要求听起来很容易实现。
-
遗憾的是,这个正则表达式
(.\\d{0,17}\\W\\d{0,4})不能完全工作,因为我不确定如何将总长度限制为 20