模式不能使用少于一个参数

时间:2014-01-16 17:18:25

标签: java regex bukkit

您好我正在尝试为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,模式也会起作用。

提前致谢:)

1 个答案:

答案 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
}

希望有所帮助