使用this作为尝试模拟if-else Java正则表达式的指南,我提出:
[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))
执行以下操作:
0-2之间的可选数字,包括最左边的数字;但是,如果第一个数字是2,则右边的下一个数字可以是最大数字5.如果是0或1,或者留空,则0-9有效。我试图最终允许用户只写0-255号数字。
在Regex101和javac上测试正则表达式对测试用例不起作用,尽管Regex101的解释与我想要的一致。
当我测试正则表达式时:
System.out.println("0".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
---&gt;假
System.out.println("2".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
----&gt;真
System.out.println("25".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
----&gt;假
System.out.println("22".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
----&gt;假
System.out.println("1".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
----&gt;假
到目前为止,从少数测试用例来看,2是正则表达式接受的唯一有效案例。
作为参考,这是我的初始正则表达式,使用if-else将数字限制在0-255范围内:[0-2]?(?(?<=2)[0-5]|[0-9])(?(?<=25)[0-5]|[0-9])
答案 0 :(得分:1)
我不明白为什么要模仿if
else
来检查范围。它只是将一些模式放在一起。
^(?:[1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$
^
启动主播(?:
打开non capture group以进行更改[1-9]?\d
匹配0-99 1\d\d
匹配100-199 2[0-4]\d
匹配200-249 25[0-5]
匹配250-255 $
结束锚允许前导零,您可以将其缩小为^(?:[01]?\d\d?|2[0-4]\d|25[0-5])$
答案 1 :(得分:0)
当您尝试仅允许一系列数字(0-255)时,为什么要使用正则表达式?而是将字符串解析为int并检查它是否在范围内。
public static boolean isInRange(String input, int min, int max) {
try {
int val = Integer.parseInt(input);
return val >= min && val < max;
} catch (NumberFormatException e) {
return false;
}
}