您好我正在尝试为minecraft-server插件设置主机名模式。它将查看聊天消息的参数并尝试查找任何可能的主机名。代码有效,除非消息只包含一个单词。
这是检查消息事件的类:
package com.carlgo11.preventip.player;
import com.carlgo11.preventip.Main;
import java.util.regex.Matcher;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
public class ChatEvent implements Listener {
Main plugin;
public ChatEvent(Main plug)
{
super();
this.plugin = plug;
}
@EventHandler
public void PlayerChat(AsyncPlayerChatEvent e)
{
if (!plugin.getConfig().getBoolean("ignore-chat")) {
Player p = e.getPlayer();
String msg = e.getMessage();
String[] args = msg.split(" ");
Boolean match = false;
if (!p.hasPermission("preventip.ignore")) {
for (int i = 0; i < args.length; i++) {
Matcher hnre = plugin.hostnamePattern.matcher(msg.toString());
Boolean hnrematch = hnre.find();
if (hnrematch) {
match = true;
break;
}
}
if (match) {
e.setCancelled(true);
Action.action(p, plugin);
}
}
}
}
}
这是模式
Pattern hostnamePattern = Pattern.compile("^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$");
因此,当args包含多于1个单词时,该模式可以正常工作,但如果不是,则即使hnre.find()输出false,模式也会起作用。
提前致谢:)
答案 0 :(得分:0)
首先,请使用Java命名约定(请参阅https://stackoverflow.com/tags/java/info)。
关于你的方法设计,我觉得有些奇怪,首先你要分开信息:
String[] args = msg.split(" ");
但是你会尝试将你的正则表达式与整条信息相匹配,对于你邮件中的每个单词:
Matcher hnre = plugin.hostnamePattern.matcher(msg.toString());
我认为你可以简化所有这样的事情:
//remove ^ and $ to find the pattern in any position in your message. I assume the correctness of the pattern
Pattern hostnamePattern = Pattern.compile("(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])");
//Let msg a annoying message
String msg = "ereh un enfermo, ereh un enfermo, ereh un enfermo de ciberseso me pone loh cuenno " +
"me pone lo cuenno www.tiahbuena.com esto vida mia eh un infienno";
Matcher m = hostnamePattern.matcher(msg);
boolean hnrematch = m.find();
if(hnrematch){
//cancel what you want
}
希望有所帮助