正则表达式的编号范围为0到31,不包括前面的零

时间:2015-08-03 15:50:50

标签: java regex

我从0到31的数字写了正则表达式。它不允许前面的零。

[0-2]\\d|/3[0-2]

但它也允许前面的零。

01 invalid
02 invalid

有些人可以告诉我如何解决这个问题。

6 个答案:

答案 0 :(得分:3)

维护包含regex的代码比较困难:请参阅When you should not use Regular Expressions

为了让您的代码更易于维护且更容易让其他开发人员加入并支持,您可以考虑将String转换为Integer,然后测试该值吗?

if((!inputString.startsWith("0") && inputString.length() == 2) || inputString.length() == 1){
  Integer myInt = Integer.parseInt(inputString);
  if( 0 <= myInt && myInt <= 31){
    //execute logic...
  }
}

您也可以轻松地将其分解为一种非常具有描述性的实用方法,例如:

private boolean isBetween0And31Inclusive(String inputString){
    try{
        if((!inputString.startsWith("0") && inputString.length() == 2) || inputString.length() == 1){
            Integer myInt = Integer.parseInt(inputString);
            if(0 <= myInt && myInt <= 31){
              return true;
            }
        }

        return false;

    }catch(NumberFormatException exception){
        return false;
    }
}

答案 1 :(得分:2)

您可以使用以下正则表达式:

XHR.responseType = "arraybuffer";

请参阅demo

您的正则表达式 - ^(?:[0-9]|[12][0-9]|3[01])$ - 包含2个备选方案:1)[0-2]\\d|/3[0-2]首先匹配0-2范围内的数字,然后匹配任意1位数(带[0-2]\\d)和2){ {1}}匹配\\d,然后匹配/3[0-2],然后匹配0-2范围内的1位数。重要的是,如果没有锚点(/3),此表达式将匹配较长字符串中的子字符串,并匹配^中的$

由于已经有一些关于速记类的讨论,这里是一个带有速记类的版本,这里也是一个01的例子,它需要完整的输入才能匹配,因此我们不需要显式锚:

010

请参阅demo

请注意,反斜杠应该加倍。

答案 2 :(得分:2)

您可以尝试使用以下模式:

^(?:[12]?[0-9]|3[01])$

答案 3 :(得分:2)

在尝试将Regex转换为String之前,只需另一种非int方法进行数据验证。这里我们验证数据至少是一个数字,或者数据是2个字符的数字,第一个字符不是0。

public static void main(String[] args) throws Exception {
    List<String> data = new ArrayList() {{
       add("01");   // Bad
       add("1A");   // Bad
       add("123");  // Bad
       add("31");   // Good
       add("-1");   // Bad
       add("32");   // Bad
       add("0");    // Good
       add("15");   // Good
    }};

    for (String d : data) {
        boolean valid = true;
        if (d.isEmpty()) {
            valid = false;
        } else {
            char firstChar = d.charAt(0);
            if ((d.length() == 1 && Character.isDigit(firstChar)) ||
                (d.length() == 2 && 
                    (Character.isDigit(firstChar) && firstChar != '0' && 
                     Character.isDigit(d.charAt(1))))) {
                int myInt = Integer.parseInt(d);
                valid = (0 <= myInt && myInt <= 31);
            } else {
                valid = false;
            }
        }
        System.out.println(valid ? "Valid" : "Invalid");
    }
}

结果:

Invalid
Invalid
Invalid
Valid
Invalid
Invalid
Valid
Valid

答案 4 :(得分:2)

另一种选择:

\\b(?:[12]?\\d|3[12])\\b

Demo

答案 5 :(得分:2)

正则表达式不使用无捕获组:

^(\d|[12]\d|3[01])$

说明:

  

^ - 行的开头
\ d - 单个数字0-9

[12] \ d - 数十   和二十一或三[01] - 三十三十一 - $ - 行结束

Java DEMO