2012-04-17 11 views
1

私は例えばIPアドレスの連結によって形成された文字列を、持っている:新しいIPアドレスが与えられると文字列がより大きな文字列の一部であるかどうかを確認する最も効率的な方法は何ですか?

"127.272.1.43;27.27.1.43;127.127.27.67;128.27.1.43;127.20.1.43;111.27.1.43;127.27.1.43;" 

、私はIPの前半は、IPアドレスの一部であるかどうかを確認する必要があります文字列。文字列内のIPアドレスのいずれかが"127.27"

で始まる場合たとえば、"127.27.123.23"場合は、指定された私が見つける必要があるI userIP = "127.27."

int i = StringUtils.indexOf(dbIPString, userIP); 
do { 
    if (i > 0) { 
     char ch = dbIPString.charAt(i - 1); 
     if (ch == ';') { 
      System.out.println("IP is present in db"); 
      break; 

     } else { 
      i = StringUtils.indexOf(dbIPString, userIP, i); 
     } 
    } else if (i == 0) { 
     System.out.println("IP is present in db"); 
     break; 
    } else { 

     System.out.println("IP is not present in db"); 
    } 
} while (i >= 0); 

はそれができる次のコードは、より効率的に持っていますか?または正規表現を使用できますか?どれが効率的ですか?

+0

あなたは' 127.255.1.43'のような文字列が一致しますか? (私はあなたの質問のように '127.272.1.43'よりももっと賢明な例を選択しました)... –

+0

@TimPietzckerすみません、誰かが編集して、27の後に続くドットを削除しました..私はそれを後で追加しました –

答えて

1

普通の文字列のマッチは通常、正規表現のマッチングよりも速いです。私はそれをシンプルに保つと、このような何かしたい:あなたは常にリストを持って開始するために手配することができた場合

if (StringUtils.startsWith(dbIPString, userIP)) { 
    ... // prefix is present 
} else if (StringUtils.indexOf(dbIPString, ";" + userIP) > 0) { 
    ... // prefix is present 
} else { 
    ... // prefix is not present 
} 

を「;」最初のエントリを検索することはもはや特殊なケースではなくなり、論理を単純化することができる。

リストが大きくなり、これらの検索を多くしてスピードを重視すると、アドレスのリストを作成するときに、各プレフィックスを何らかのハッシュやツリーに追加する可能性があります。これらのデータ構造内のルックアップは、文字列の一致よりも速くなければなりません。

+0

+1よりスマートなデータ構造を提供します。文字列は、高速プレフィックス検索をサポートするためのものではありません。 IPアドレスのツリーを構築すると、この質問は簡単になります。 (正規表現ではなく普通の文字列ルーチンの使用を提案するために+1をもう1つ与えますが、1回だけアップアップすることができます;)) –

+0

これは部分一致も見付けます。たとえば、 '127.25'を探しているなら、おそらくDarshanが期待するものではない' 127.255.1.43'もあります。 –

+0

@TimPietzckerいいえ..「127.25」を探しているからです。 –

0

あなたが唯一の全体のIPアドレスが一致したの世話をすると仮定すると、あなたがフィット正規表現となり、その後、127.25ため

(?<=^|;)127\.25\.\d+\.\d+ 

を探している時に一致させるためにはしたくない127.255.1.43を想定しました。 Javaでは

: `127.25`を探していたときに

Pattern regex = Pattern.compile(
    "(?<=^|;)  # Assert position at the start of the string or after ;\n" + 
    Pattern.quote(userIP) + 
    "\\.\\d+\\.\\d+ # Match .nnn.nnn", 
    Pattern.COMMENTS); 
関連する問題