0

我正在尝试使用 Java 编写一个 Minecraft Bukkit 插件,该插件会在聊天中找到一个 IP,所以我使用正则表达式。我需要的是正则表达式来查找字符串中的任何位置,一个字符后跟一个句点,然后是另一个字符,例如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

请阅读:链接

PADDRESS_PATTERN = 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
于 2013-10-24T21:08:18.510 回答
1

我需要的是正则表达式来查找字符串中的任何位置,一个字符后跟一个句点,然后是另一个字符。我需要它在任何字符串中找到任意数量的 [letter/number].[letter/number],如果这有意义的话......

您可以在这里做的是使用单词边界\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]*

它匹配一个或多个数字,后跟一个句点三次,最后是一个或多个数字。这意味着您将获得与“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());

正则表达式很棒,尽管学习曲线很陡峭。祝你学习顺利!

于 2013-10-24T21:35:31.980 回答