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

Java 如何限制小数点前/后/的位数以及正则表达式的总体位数?,java,regex,Java,Regex,我试图检查一个数值是否有特定数量的数字 总共不应该超过19位 小数点前不应超过17位(整数部分) 小数点后不得超过4位(小数部分) 可以有小数点,也可以没有小数点 前面可以有+或-或不 有效例子: 一, 1.0 .0 12345678901234567.12 +12345678901234567.12 -12345678901234567.12 1234567890123345.1234 +1234567890123345.1234 -1234567890123345.1234 无效示例

我试图检查一个数值是否有特定数量的数字

  • 总共不应该超过19位
  • 小数点前不应超过17位(整数部分)
  • 小数点后不得超过4位(小数部分)
  • 可以有小数点,也可以没有小数点
  • 前面可以有+或-或不
  • 有效例子:

    • 一,
    • 1.0
    • .0
    • 12345678901234567.12
    • +12345678901234567.12
    • -12345678901234567.12
    • 1234567890123345.1234
    • +1234567890123345.1234
    • -1234567890123345.1234
    无效示例

    • 12345678901233456.1234//因为有20位数字
    • 1234567890123345678.1//因为小数点前有超过17位数字
    • 1.12345//因为小数点后有4位以上的数字
    我试过的例子,但不能让他们工作,我想如何。我想我很难理解如何使用look aheads/arounds,因为这一部分并不能真正实现我希望的功能:

    @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());
    }
    
    您可以使用
    \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
      匹配字符串的结尾
    试试这个:

    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");
        }
    }
    
    Pattern p=Pattern.compile((-)(\\+)?(\\d+)\.(\\d+);
    匹配器m=p.Matcher(“12345678901233456.1234”);
    if(m.find()){
    
    if(m.group(3).length()是否必须是一个正则表达式。通过循环这些数字字符串的各个字符,这些要求听起来很简单。遗憾的是,这个正则表达式
    (..\\d{0,17}\\W\\d{0,4})
    不完全有效,因为我不确定如何将总长度限制在20。谢谢你的想法,但不幸的是,我只限于纯正则表达式。因此我接受了塞巴斯蒂安·普罗斯克的答案。@gill.当然,没有遗憾。我也对这个答案投了赞成票:)