以此为指导来尝试模拟 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]))"));
--->假
System.out.println("2".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
---->真实
System.out.println("25".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
----> 假
System.out.println("22".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
---->假
System.out.println("1".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
---->假
到目前为止,从少数测试用例来看,2 是正则表达式接受的唯一有效案例。
作为参考,这是我的初始正则表达式,使用 if-else 将数字限制在 0-255 范围内: [0-2]?(?(?<=2)[0-5]|[0-9])(?(?<=25)[0-5]|[0-9])
我不明白为什么要模仿if
else
来检查范围。它只是将一些模式放在一起。
^(?:[1-9]?d|1dd|2[0-4]d|25[0-5])$
-
^
启动锚点 -
(?:
打开一个非捕获组进行交替 -
[1-9]?d
比赛 0-99 -
1dd
比赛 100-199 -
2[0-4]d
比赛 200-249 -
25[0-5]
匹配 250-255 -
$
端锚
在正则表达式101观看演示
通过允许前导零,您可以将其
减少到^(?:[01]?dd?|2[0-4]d|25[0-5])$
<</p>
既然您尝试只允许一系列数字 (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;
}
}