繁体   English   中英

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

[英]java regular expression IP address pattern match

为了区分内部和外部用户,我在scriplet标记内使用了Java正则表达式,下面的代码是:

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地址匹配方式?

2个更正:

  1. . 应该转义,否则意味着任何字符
  2. \\\\d在您的replaceAll调用中需要加倍转义,因为这最终成为您的最终正则表达式。

这是工作代码:

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方法(不支持正则表达式),这样就无需进行两次转义。 所以就这样使用:

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

我不知道这是不是原因,但请尝试更改. 在您的内部IP声明中以\\.

. 在regexp中用于匹配所有内容。

我建议不要对正则表达式执行过于复杂的IP体操。

进行常规检查的“([[0-9] {1,3}。){3} [0-9] {1,3})”可以,然后我将执行

"166.41.8.123".split ("\\.")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM