【问题标题】:Java Regex Find Characters In Any String [closed]Java正则表达式在任何字符串中查找字符[关闭]
【发布时间】:2013-10-24 21:04:12
【问题描述】:

我正在尝试使用 Java 编写一个 Minecraft Bukkit 插件,该插件会在聊天中找到一个 IP,所以我正在使用正则表达式。我需要的是正则表达式来查找字符串中的任何位置,一个字符后跟一个句点,然后是另一个字符,例如127.0.0.1 是有效的,但它还需要能够找到它周围的任何字符,例如@987654325 @。这是我当前的代码:

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],如果这有意义的话。

【问题讨论】:

  • 您应该阅读一些regex tutorial 或至少在提问之前尝试搜索regex for IP. 是特殊字符,表示“除换行符以外的任何字符”,[a-z1-9] 将匹配 a-z1-9 范围内的 一个 字符,因此您需要添加量词。此外,如果您想匹配 IPv4,那么 a-z 在您的正则表达式中做了什么?
  • @Pshemo 阅读我的评论以获得 plsgogame 的答案。
  • 如果您还想找到像jointhis.server.com 这样的主机名,那么您绝对应该阅读我在之前评论中链接的问题答案。

标签: java regex string character


【解决方案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

【讨论】:

  • 太棒了!我稍微更改了正则表达式(添加了几个 .*),它非常适用于 IP、主机名以及我尝试过的任何围绕它的字符串。谢谢:)
【解决方案2】:

请阅读:link

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])";

【讨论】:

  • 唯一的问题是开头和结尾的^$ 将阻止它为OP 的应用程序查找IP 地址。除此之外,这是一个非常好的答案。
  • 我真的很喜欢这个答案,它主要是有效的,但我也需要它,以便它可以在一个随机抛出的字符串中找到,并且它也可以与字母一起使用,因为一些 IP 可以使用自定义 IP,例如 jointhis.server.com 之类的
  • @BenBarkay thx,已修复。
  • @DonkeyTeeth2013 您所描述的不是 IP 地址,而是主机名。可以在此答案中发布的链接 plsgogame 中找到查找主机名的正则表达式。您应该投票并接受此答案,因为它实际上正确回答了您的问题并为其提供了工作代码。
【解决方案3】:

试试这个:

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

这将简单地找到由句点分隔的 4 个 3 位数字的任何序列。

编辑: plsgogame 的答案包含更好的查找 IP 地址的模式(可能只包含 0 到 255 之间的数字)。

【讨论】:

    【解决方案4】:

    您的正则表达式匹配任何以 [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]
    

    这将匹配由点分隔的三位数字组。

    如果你想快进到更有趣、更有效但如果你是初学者也更难理解的东西,你可以使用on this page的例子,即:

    \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());
    

    虽然学习曲线陡峭,但正则表达式非常棒。祝你学习顺利!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      相关资源
      最近更新 更多