【问题标题】:How to limit the number of digits before/after/ a decimal point and also overall with regex?如何限制小数点之前/之后/小数点的位数以及正则表达式的整体?
【发布时间】:2017-04-07 09:32:01
【问题描述】:

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

  1. 总位数不应超过 19 位
  2. 小数点前不得超过 17 位(整数部分)
  3. 小数点后不超过 4 位(小数部分)
  4. 可以有也可以没有小数点
  5. 前面可以有 + 或 - 或没有

有效示例:

  • 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

标签: java regex


【解决方案1】:

您可以使用\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 位,如果 12. 有效,则可以使用 {0,4}
  • \z匹配字符串结尾

【讨论】:

    【解决方案2】:

    试试这个:

    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");
        }
    }
    

    【讨论】:

    • 感谢您的想法,但不幸的是,我仅限于纯正则表达式。因此我接受了 Sebastian Proske 的回答。
    • @GilR。当然,不后悔。我也赞成这个答案:)
    猜你喜欢
    • 2018-07-16
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多