我从0到31的数字写了正则表达式。它不允许前面的零。
[0-2]\\d|/3[0-2]
但它也允许前面的零。
01 invalid
02 invalid
有些人可以告诉我如何解决这个问题。
答案 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)
答案 5 :(得分:2)
此正则表达式不使用无捕获组:
^(\d|[12]\d|3[01])$
说明:
^ - 行的开头
\ d - 单个数字0-9
或
[12] \ d - 数十 和二十一或三[01] - 三十三十一 - $ - 行结束
Java DEMO