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

时间:2012-05-08 20:48:38

标签: java jsp

为了区分内部和外部用户,我在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地址模式的最佳方法?

3 个答案:

答案 0 :(得分:3)

2次更正:

  1. 句号.应该转义,否则表示任何字符
  2. 你的\\d电话中的
  3. replaceAll需要被双重逃脱,因为这最终会成为你的最终正则表达式。
  4. 以下是工作代码:

    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])")+")$");
    

答案 1 :(得分:1)

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

regexp中的

.用于匹配所有内容。

答案 2 :(得分:1)

我建议不要用正则表达式来执行过于复杂的知识产权体操。

“([0-9] {1,3}。){3} [0-9] {1,3})”对于一般检查没问题,那我就做了

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

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