【发布时间】:2012-05-17 09:19:04
【问题描述】:
为了区分内部用户和外部用户,我在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 地址模式的最佳方法?
【问题讨论】:
-
记住一个'.'是正则表达式中的单个任意字符。你需要逃避那些。 regular-expressions.info/numericranges.html 有一些很好的例子来匹配特定的数字范围。我很想将 addr 带到一个字节数组(或一个 int)中,然后对两者进行按位运算。另见stackoverflow.com/questions/4256438/… 和stackoverflow.com/questions/220110/…