2

内部ユーザーと外部ユーザーを区別するために、スクリプトレットタグ内で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の場合、入力が12.16.2.1または12.22.12.3の場合、IPアドレスは内部IPとして正しく識別され、IPアドレスは内部IPとして正しく識別されません。これは、2つの「X」との一致パターンに関係していると思います。誰かがパターンマッチングの問題を特定できますか?または、IPアドレスのパターンを照合する最良の方法をお勧めしますか?

4

3 に答える 3

3

2 修正:

  1. ピリオド.はエスケープする必要があります。それ以外の場合は、任意の文字を意味します
  2. \\dreplaceAll最終的に最終的な正規表現になるため、呼び出しで二重にエスケープする必要があります。

作業コードは次のとおりです。

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-08T20:58:55.880 に答える
1

正規表現を使用して複雑すぎるIP体操を実行しないことをお勧めします。

「([0-9] {1,3}。){3} [0-9] {1,3})」の一般的なチェックは問題ありません。

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

Integer.parseIntと範囲チェックまたは値の比較が続きます。

于 2012-05-08T21:03:01.173 に答える
1

これが原因かどうかはわかりませんが.、内部 IP 宣言の を に変更してみてください。\.

.in regexp は、すべてに一致するために使用されます。

于 2012-05-08T20:56:32.370 に答える