为了区分内部和外部用户,我在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地址模式的最佳方法?
答案 0 :(得分:3)
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])")+")$");
答案 1 :(得分:1)
我不知道这是否是原因,但请尝试将内部IP声明中的.
更改为\.
.
用于匹配所有内容。
答案 2 :(得分:1)
我建议不要用正则表达式来执行过于复杂的知识产权体操。
“([0-9] {1,3}。){3} [0-9] {1,3})”对于一般检查没问题,那我就做了
"166.41.8.123".split ("\\.")
后跟Integer.parseInt和范围检查或值比较。