[英]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个更正:
.
应该转义,否则意味着任何字符 \\\\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.