0

IPがチャットに配置されたときに見つけるJavaを使用してMinecraft Bukkitプラグインをプログラムしようとしているので、正規表現を使用しています。私が必要とするのは、文字列内の任意の場所を見つけるための正規表現です。文字の後にピリオドが続き、その後に別の文字が続きます。たとえば、127.0.0.1有効ですが、This IP: 127.0.0.1 is your localhost IP. これは私の現在のコードです:

Pattern p = Pattern.compile("[a-z1-9]" + "." + "[a-z1-9]");
Matcher matcher = p.matcher(message);
if(matcher.matches()){
    player.sendMessage(plugin.prefix + "§7You cannot advertise an IP address!");
    event.setCancelled(true);
}

このコードは、そのようなものだけを検索しますが、上で述べたように、意味がある場合は、任意の文字列で127.0任意の量を検索する必要があります。[letter/number].[letter/number]

4

4 に答える 4

1

私が必要とするのは、文字列内の任意の場所を見つけるための正規表現です。文字の後にピリオドが続き、別の文字が続きます。それが理にかなっていれば、任意の文字列で[文字/数字].[文字/数字]の任意の量を見つける必要があります...

ここでできることは、単語境界\bを使用して、より大きなテキストでこれらのパターンに一致させることです。

簡単な解決策として、このようなものを使用できます。

\\b((?:(?:[0-9]{1,3}\\.){3}[0-9]{1,3}|(?:[a-z0-9]+(?:-[a-z0-9]+)*\\.)+[a-z]{2,4}))\\b

例:

import java.util.regex.*;

class rTest {
  public static void main (String[] args) {
    String in = "Let's match 127.0.0.1 being valid, or this IP: 127.0.0.1 and joinTHIS.server.com or build 1.2";
    String re = "\\b((?:(?:[0-9]{1,3}\\.){3}[0-9]{1,3}|(?:[a-z0-9]+(?:-[a-z0-9]+)*\\.)+[a-z]{2,4}))\\b";
    Pattern p = Pattern.compile(re, Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(in);
    while (m.find()) {
      System.out.println(m.group(1));
    }
  }
}

出力

127.0.0.1
127.0.0.1
joinTHIS.server.com
于 2013-10-24T21:44:21.733 に答える
0

これを試して:

Pattern.compile("(\\d{1,3}\\.){3}\\d{1,3}");

これは、ピリオドで区切られた 4 つの 3 桁の数字のシーケンスを単純に検索します。

編集: plsgogameの回答には、IPアドレスを見つけるためのより良いパターンが含まれています(0〜255の数字のみが含まれる場合があります)。

于 2013-10-24T21:10:56.603 に答える
0

「.」をエスケープしていないため、正規表現は [a-z0-9] で始まり、終わる長さ 3 の任意の文字列と一致します。これは任意の文字を表します。さらに、括弧内の文字のセットを繰り返す必要があります。たとえば、次のようなものを使用できます。

[\d]*\.[\d]*\.[\d]*\.[\d]*

これは、1 つ以上の数字の後にピリオドが 3 回続き、最後に 1 つ以上の数字に一致します。これは、「123.456.789.101」の形式の文字列だけでなく、「122533252.13242351432142.375547547.62463636」のような文字列にも一致することを意味するため、完全には役に立ちません。

改善されましたが、完全ではありませんが、次のとおりです。

[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d]

これは、ドットで区切られた 3 桁のグループに一致します。

もっと興味深く効果的であるが、初心者には理解しにくいものに早送りしたい場合は、このページにある例を使用できます。

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

これはまさにあなたが必要とすることを行います。

さらに、matches() メソッドは、入力の一部ではなく、すべての入力を照合しようとするため、正規表現の最初と最後に「.*」を追加して、次のように Java コードから実行できます。

Pattern p = Pattern.compile(".*\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b.*");
Matcher matcher = p.matcher(message);
if (matcher.matches()) System.out.println("It's a match");

すべての IPを見つけたい場合は、代わりに次のようにします。

Pattern p = Pattern.compile("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
Matcher matcher = p.matcher(message);
while (matcher.find()) System.out.println("Match: " + matcher.group());

学習曲線は急ですが、正規表現は素晴らしいものです。頑張って学習してください!

于 2013-10-24T21:35:31.980 に答える