【问题标题】:Regex expression for 8 digits before decimal and 2 after decimal and whole string should not compute to zero小数点前 8 位和小数点后 2 位的正则表达式表达式不应计算为零
【发布时间】: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


    【解决方案1】:

    另一种选择是断言不仅是点和零

    ^(?![0.]*$)\d{0,8}(?:\.\d{1,2})?$
    

    Regex demo | Java demo

    在 Java 中

    String regex = "^(?![0.]*$)\\d{0,8}(?:\\.\\d{1,2})?$";
    

    如果你只想要一个匹配,你可以省略捕获组并使其不捕获(?:

    【讨论】:

    • 这个正则表达式不满足 1234.45
    • 它正在工作,实际上当我复制字符串时,它复制了两个额外的斜杠
    【解决方案2】:
    "(?=[1-9])(\\d{0,8}(\\.\\d{1,2})?)"
    

    一个非零数字的前瞻就可以了。

    【讨论】:

    • 是的,对于任何换行符也可以进行后视和 \R:\r、\r\n、NEL
    【解决方案3】:

    因为这是 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
    }
    

    【讨论】:

    • Double 方法的解析无法满足 2-decimal-point 约束,例如100.001 有三位小数,但仍能通过测试
    • 感谢您的评论,我没有考虑到这一点,并相应地更新了答案。
    猜你喜欢
    • 2018-07-16
    • 2015-04-21
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多