我正在创建一个正则表达式来评估IP地址是否为有效的组播地址。这个验证是在您键入时实时发生的(如果您键入一个无效的/超出范围的字符,它是不被接受的),所以我不能简单地根据正则表达式计算最终结果。我遇到的问题是,它允许在每组数字(224.,224.0..,224.0.0.全部显示为有效)。
下面的代码是正在发生的事情的静态表示。不知怎么的224..表现为合法的价值。我已经在线测试了这个正则表达式(非java:^2(24-9|3\d)(.(250-5|20-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()方法的计算结果都是true。这对我来说没什么意义。如果有人可以检查一下,并确保我没有犯任何明显的错误,也许可以解释一下为什么hitEnd()在这种情况下返回true,我将不胜感激。谢谢大家。
发布于 2011-08-17 08:46:05
在对自己做了一些评估之后(在发现这是在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上无效。
发布于 2011-08-17 05:59:19
我不知道您是如何测试您的正则表达式的,但根据您的描述,它看起来并不正确。
您的regext需要所有4个部分的数字。它不可能与224匹配..只有0-1和\d用问号标记,因此是可选的。
因此,在不讨论允许使用特定数字的限制细节的情况下,我建议您这样做:
^\\d{1-3}\\.(\\d{0-3}\\.)?(\\d{0-3}\\.)?(\\d{0-3}\\.)?$
而且您不必使用hitEnd():$最终就足够了。并且不要使用matches()。请改用find()。matches()类似于find(),但会自动添加^和$。
发布于 2011-08-17 05:55:00
我刚刚测试了你的代码,m.hitEnd()对我的评估结果是假的,而我收到的是无效的...
所以我真的不确定问题出在哪里?
https://stackoverflow.com/questions/7085389
复制相似问题