【发布时间】:2011-08-16 21:41:35
【问题描述】:
我正在创建一个正则表达式来评估 IP 地址是否是有效的多播地址。此验证在您键入时实时发生(如果您键入无效/超出范围的字符,则不接受),因此我不能简单地根据正则表达式评估最终结果。我遇到的问题是它允许在每组数字(224..、224.0..、224.0.0.. 都显示为有效)之后有一个双句点。
下面的代码是正在发生的事情的静态表示。不知何故 224.. 显示为合法值。我已经在线测试了这个正则表达式(非 java 化:^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 我会很感激。 谢谢大家。
【问题讨论】:
-
首先,
m.matches()始终匹配完整的输入,因此您不需要以^开始您的表达式。接下来,m.hitEnd()表示正则表达式引擎命中输入结尾,这不一定意味着您的正则表达式匹配到输入结尾。 -
@dma_k:
hitEnd()表示正则表达式已匹配,但输入不足;有了更多的输入,就有可能实现匹配(或者,如果确实匹配,则可能实现 longer 匹配)。类似于 Boost.Regex 中的partial matching。