Java Regex mimicking if-else for numbers



以此为指导来尝试模拟 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>

div class="ans>

既然您尝试只允许一系列数字 (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;
    }
}

最新更新