Java Regex在任何字符串中查找字符

时间:2013-10-24 21:04:13

标签: java regex string character

我正在尝试使用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 个答案:

答案 0 :(得分:1)

请阅读: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])";

答案 1 :(得分: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

答案 2 :(得分:0)

试试这个:

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

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

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

答案 3 :(得分:0)

你的正则表达式匹配任何长度为3的字符串,以[a-z0-9]开头和结尾,因为你没有转义'。'它代表任何角色。而且,应重复括号中的字符集。例如,您可以使用以下内容:

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

虽然学习曲线陡峭,但正则表达式很棒。祝你学习好运!