如何限制小数点之前/之后的位数以及正则表达式的总数?

时间:2017-04-07 09:32:01

标签: java regex

我正在尝试检查数值是否有特定的数字位数。

  1. 整体不应超过19位
  2. 小数点前不应超过17位(整数部分)
  3. 小数点后(小数部分)不应超过4位数
  4. 可以有一个小数点
  5. 可以有前面的+或 - 或者不是
  6. 有效的例子:

    • 1
    • 1.0
    • 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());
    }
    

2 个答案:

答案 0 :(得分:5)

您可以使用\A(?=.*\d)(?!(?:\D*\d){20,})[+-]?\d{0,17}(?:\.\d{1,4})?\z。在java代码中使用它时,请记住使用双反斜杠。

  • \A - 匹配字符串
  • 的开头
  • (?=.*\d)检查至少有一个数字(因为基本上每个都是可选的)
  • (?!(?:\D*\d){20,})检查数字不超过19位
  • [+-]?匹配可选+-
  • \d{0,17}最多匹配17位整数部分
  • (?:\.\d{1,4})?最多匹配小数部分中的4位数,如果{0,4}有效,则可以使用12.
  • \z匹配字符串的结尾

答案 1 :(得分:0)

试试这个:

Pattern p = Pattern.compile("(-)?(\\+)?(\\d+)\\.(\\d+)");
Matcher m = p.matcher("1234567890123456.1234");
if(m.find()){
    if(m.group(3).length()<=17 && m.group(4).length()<=4 && (m.group(3).length()+m.group(4).length()<20)){
            System.out.println("Correct");
    }
}