我正在尝试使用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]
,如果这样做有意义的话。
答案 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());
虽然学习曲线陡峭,但正则表达式很棒。祝你学习好运!