「.」をエスケープしていないため、正規表現は [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());
学習曲線は急ですが、正規表現は素晴らしいものです。頑張って学習してください!