java 用正则表达式处理常见问题
工作中遇到一个需求,有个值域范围是0-65535之间,范围之间用“-”表示,可以用“,”间隔。示例:3-76,122-8888,9000-60000
废话不多说,先上代码
public static boolean checkValid(String input) {
String regex = "(([0-5]?\\d?\\d?\\d?\\d|6[0-4]\\d\\d\\d|65[0-4]\\d\\d|655[0-2]\\d|6553[0-5])-([0-5]?\\d?\\d?\\d?\\d|6[0-4]\\d\\d\\d|65[0-4]\\d\\d|655[0-2]\\d|6553[0-5])[,]?)*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
boolean isOutLimit = true;
//如果以','结尾,删掉这个','
if (",".equals(input.substring(input.length() - 1))) {
input = input.substring(0, input.length() - 1);
}
if (input.split("\\,").length > 5) {
isOutLimit = false;
}
return (matcher.matches() && isOutLimit);
}
主要解释一下我写的正则表达式:
String regex = “(([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])-([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])[,]?)*”;
https://www.cnblogs.com/lzq198754/p/5780340.html
“/”是转义字符
-
[a-z]
字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身 -
?
匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。 -
\d
匹配一个数字字符。等价于[0-9]。 -
|
将两个匹配条件进行逻辑“或”(Or)运算。 -
(pattern)
匹配pattern并获取这一匹配。 -
匹配前面的子表达式任意次
所以([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])我们就可以理解为
“[0-5]” 以是0到5开头的数字,
“?” 后面匹配0到1个,
“\d” 0到9的数字
“|” 或者
以6开头的数字,后一位是
“[0-4]” 以是0到4开头的数字,后一位是
“\d” 0到9的数字
…
以此类推可以匹配所有0到65535之间的数。
最后加了一个“”号,以为项目要求范围可以分段,可以用“,”间隔,所以加号匹配前面的子表达式任意次