您的正则表达式匹配以 [a-z0-9] 开头和结尾的任何长度为 3 的字符串,因为您没有转义“。” 代表任何字符。此外,括号中的字符集应重复。例如,您可以使用类似的东西:
[\d]*\.[\d]*\.[\d]*\.[\d]*
它匹配一个或多个数字,后跟一个句点三次,最后是一个或多个数字。这意味着您将获得与“123.456.789.101”形式的任何字符串的匹配,但也可以与“122533252.13242351432142.375547547.62463636”之类的字符串匹配,所以这并不完全有帮助。
以下是一项改进,但并不完美:
[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d]
这将匹配由点分隔的三位数字组。
如果你想快进到更有趣、更有效但如果你是初学者也更难理解的东西,你可以使用这个页面上的示例,即:
\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());
正则表达式很棒,尽管学习曲线很陡峭。祝你学习顺利!