Java Regex模仿if-else数字

时间:2016-02-10 02:04:49

标签: java regex

使用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])

2 个答案:

答案 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
  • $结束锚

See demo at regex101

允许前导零,您可以将其缩小为^(?:[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;
    }
}