首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java正则表达式IP地址模式匹配

java正则表达式IP地址模式匹配
EN

Stack Overflow用户
提问于 2012-05-09 04:48:38
回答 3查看 5.5K关注 0票数 2

为了区分内部和外部用户,我在scriplet标记中使用了java正则表达式,代码如下:

代码语言:javascript
复制
String ipAddress  = request.getHeader("iv-remote-address");

String internalIPs = 
"166.41.8.X" + "|" +"12.16.X.X" + "|" +"12.22.X.X" + "|" +"132.23.X.X" + "|";

Pattern p = Pattern.compile("^(?:"+internalIPs.replaceAll("X", "(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])")+")$");

Matcher m = p.matcher(ipAddress);

if (m.matches())
{
    //print internal IP     
} else{
    //print external IP 
}   

如果输入为166.41.8.2,则IP地址被正确识别为内部IP;如果输入为12.16.2.1或12.22.12.3,则IP地址未被正确识别为内部IP。我猜这与2个“X”的模式匹配有关。有人能找出模式匹配的问题吗?或者可以推荐一种匹配IP地址模式的最佳方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-09 04:58:56

2更正:

  1. period .应该进行转义,否则这意味着replaceAll调用中的任何正则表达式都需要进行双重转义,因为它最终会成为您的最终正则表达式。

以下是工作代码:

代码语言:javascript
复制
String ipAddress  = "12.16.2.1";
String internalIPs = 
"166\\.41\\.8\\.X" + "|" +"12\\.16\\.X\\.X" + "|" +
"12\\.22\\.X\\.X" + "|" +"132\\.23\\.X\\.X" + "|";

Pattern p = Pattern.compile("^(?:"+internalIPs.replaceAll("X",
                            "(?:\\\\d{1,2}|1\\\\d{2}|2[0-4]\\\\d|25[0-5])")+")$");

//System.out.println(p.pattern());

Matcher m = p.matcher(ipAddress);
if (m.matches())
    System.out.println("print internal IP"); // gets printed  
else
    System.out.println("print external IP"); 

替代选项:

因为在internalIPs.replaceAll调用中并没有真正使用任何正则表达式,所以最好使用String#replace方法(它不支持正则表达式),这样就不需要双重转义了。所以只需像这样使用:

代码语言:javascript
复制
Pattern p = Pattern.compile("^(?:" + internalIPs.replace("X",
                            "(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])")+")$");
票数 3
EN

Stack Overflow用户

发布于 2012-05-09 04:56:32

我不知道这是否是原因,但请尝试将内部if声明中的.更改为\.

正则表达式中的.用于匹配所有内容。

票数 1
EN

Stack Overflow用户

发布于 2012-05-09 05:03:01

我建议不要使用正则表达式执行太复杂的IP体操。

"(0-9{1,3}.){3}0-9{1,3})“对于一般检查是可以的,然后我将执行

代码语言:javascript
复制
"166.41.8.123".split ("\\.")

然后是Integer.parseInt和范围检查或值比较。

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

https://stackoverflow.com/questions/10506262

复制
相关文章

相似问题

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