为了区分内部和外部用户,我在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地址模式的最佳方法?
发布于 2012-05-09 04:58:56
2更正:
.应该进行转义,否则这意味着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])")+")$");发布于 2012-05-09 04:56:32
我不知道这是否是原因,但请尝试将内部if声明中的.更改为\.
正则表达式中的.用于匹配所有内容。
发布于 2012-05-09 05:03:01
我建议不要使用正则表达式执行太复杂的IP体操。
"(0-9{1,3}.){3}0-9{1,3})“对于一般检查是可以的,然后我将执行
"166.41.8.123".split ("\\.")然后是Integer.parseInt和范围检查或值比较。
https://stackoverflow.com/questions/10506262
复制相似问题