首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android上使用正则表达式实现部分匹配时出现问题

在Android上使用正则表达式实现部分匹配时出现问题
EN

Stack Overflow用户
提问于 2011-08-17 05:41:35
回答 4查看 1K关注 0票数 3

我正在创建一个正则表达式来评估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}$ ),它工作得很好,不接受我描述的无效输入。

代码语言:javascript
运行
复制
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,我将不胜感激。谢谢大家。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-17 08:46:05

在对自己做了一些评估之后(在发现这是在Android上),我意识到在Dalvik上与在常规JVM上响应相同的代码是不同的。

代码是:

代码语言:javascript
运行
复制
   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上无效。

票数 4
EN

Stack Overflow用户

发布于 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(),但会自动添加^和$。

票数 1
EN

Stack Overflow用户

发布于 2011-08-17 05:55:00

我刚刚测试了你的代码,m.hitEnd()对我的评估结果是假的,而我收到的是无效的...

所以我真的不确定问题出在哪里?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7085389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档