使用这作为试图模拟if-else Java regex的指南,我想出了:[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))
来执行以下操作:
0-2之间的可选数字,其中包括最左边的数字;但是,如果第一个数字是2,那么右边的下一个数字可以是最大的5。如果是0或1,或左空,那么0-9是有效的。我试图最终允许用户只写数字0-255。
在Regex101和javac上测试正则表达式并不适用于测试用例,尽管Regex101解释与我想要的是一致的。
当我测试regex时:
System.out.println("0".matches("[0-2]?(?:(?<=2)(?![6-9])|(?<!2)(?=[0-9]))"));
-> false
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])
范围内。
发布于 2016-02-10 03:07:47
我不明白为什么要模仿if
else
来检查范围。只是把一些模式拼凑在一起。
^(?:[1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$
^
启动锚(?:
打开一个用于交互的非俘获群[1-9]?\d
匹配0-991\d\d
匹配100-1992[0-4]\d
匹配200-24925[0-5]
匹配250-255$
端锚通过允许前导零,您可以将其缩减为
发布于 2016-02-10 02:12:45
既然您只允许一个范围的数字(0-255),那么为什么要使用regex呢?相反,将字符串解析为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;
}
}
https://stackoverflow.com/questions/35305658
复制相似问题