我正在创建一个正则表达式来评估 IP 地址是否为有效的多播地址。此验证在您键入时实时发生(如果您键入无效/超出范围的字符,则不被接受)因此我不能简单地根据正则表达式评估最终结果。我遇到的问题是它允许在每组数字(224..、224.0..、224.0.0.. 都显示为有效)之后有一个双周期。
下面的代码是正在发生的事情的静态表示。 224.. 以某种方式显示为合法值。我已经在线测试了这个正则表达式(非 java'ized: ^2(2[4-9]|3\d)(.(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$ ),它运行良好,不接受我描述的无效输入。
Pattern p = Pattern.compile("^2(2[4-9]|3\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
Matcher m = p.matcher("224..");
if (!m.matches() && !m.hitEnd()) {
System.out.println("Invalid");
} else {
System.out.println("Valid");
}
每当我输入 224.. 时,方法 m.hitEnd() 的计算结果似乎都为真,这对我来说没有意义。 如果有人可以检查一下并确保我没有犯任何明显的错误,并且可能会解释为什么 hitEnd() 在这种情况下返回 true,我将不胜感激。 谢谢大家。
最佳答案
在 self 评估之后(发现这是在 Android 上),我意识到相同的代码在 Dalvik 上的响应与在常规 JVM 上的响应不同。
代码是:
Pattern p = Pattern.compile("^2(2[4-9]|3\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
Matcher m = p.matcher("224..");
if (!m.matches() && !m.hitEnd()) {
System.out.println("Invalid");
} else {
System.out.println("Valid");
}
此代码(尽管稍作修改)在 Android 上打印有效,在 JVM 上打印无效。
关于java - 在 Android 上使用正则表达式实现部分匹配时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7085389/