java - Java 中 Twitch-Bot 的字符串正则表达式

标签 java regex bots twitch

目前我正在 Java 上使用 pIRC 编写 Twitch-Bot 程序。

我想整理命令,例如 !<command> [<tagged-user>]

现在我使用该代码:

private boolean checkForCommand(String message) {
    Pattern pattern = Pattern.compile("^(!)\\w+");
    Matcher m = pattern.matcher(message);
    return m.find();
}

public void onMessage(String channel, String sender, String login,String hostname, String message){
    String user = sender;
    if(checkForCommand(message)){
        String[] arguments;
        if(message.split("\\s+").length > 1){
            arguments = message.split("\\s+");
        }else {
            arguments = new String[1];
            arguments[0] = message;
        }
        String command = arguments[0].substring(1, arguments[0].length());
        if(arguments.length > 1){
            user = arguments[1];
        }
        respondForCommand(command,user); // User gets respond for his command.
    }
}

例如,我得到 !info testuser :

testuser [here is the command response]

我想通过仅对漏洞过程进行正则表达式来改进代码。

基本上我想要一个正则表达式来读出命令名称,如果有人被标记,它也应该读取标记的用户名。

有点像Pattern pattern = Pattern.compile("!COMMANDNAME [TAGGEDUSER]");

谢谢你帮助我,我最近在正则表达式方面遇到了很多困难,但我想理解它。在线正则表达式对我没有多大帮助。

最佳答案

使用捕获组。您当前的正则表达式放置了“!”由于某种原因在捕获组中,但它不使用它。相反,请将您想要捕获的模式的重要部分放在括号内。

Pattern pattern = Pattern.compile("^!(\\w+)(?:\\s+(\\S+))?");

我们这里有:

  • 一个“!”
  • 预期作为命令的一个或多个单词字符。它们被括号包围,因此它们是第一个捕获组。
  • 然后是可选参数的非捕获组。由于它是可选的,我们添加一个“?”在这组之后。在该组中:
    • 一个或多个空格
    • 一个或多个非空格的捕获组

所以基本上,我们有两个捕获组,但如果没有参数,其中一个将不会被匹配。

现在,如果您调用 matcher.find(),则可以使用 matcher.group(1)matcher.group(2) 来访问捕获的组。 group(2) 可能会返回 null,因为如果没有参数,则不会匹配。

演示代码:

public class SimpleTest {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("^!(\\w+)(?:\\s+(\\S+))?");
        Matcher matcher;
        String[] testStrings = { "!command john", "!command john something", "!commandWithoutArguments",
                "!commandNoArgsButSpaces   ", "Not A command." };

        for (String testString : testStrings) {
            System.out.print("String <<" + testString + ">> ");
            matcher = pattern.matcher(testString);
            if (matcher.find()) {
                String command = matcher.group(1);
                String user = matcher.group(2);
                if (user == null) {
                    user = "default";
                }
                System.out.println("is a command: " + command + " user: " + user + ".");
            } else {
                System.out.println("is not a command.");
            }
        }
    }
}

输出:

String <<!command john>> is a command: command user: john.
String <<!command john something>> is a command: command user: john.
String <<!commandWithoutArguments>> is a command: commandWithoutArguments user: default.
String <<!commandNoArgsButSpaces   >> is a command: commandNoArgsButSpaces user: default.
String <<Not A command.>> is not a command.

关于java - Java 中 Twitch-Bot 的字符串正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38953805/

相关文章:

java - 如何使用 groovy 将另一个 xml 文件内容添加到现有 xml 创建中

c# - 替换所有出现和正则表达式

php - 从 HTML 内容中删除脚本标签

java - JavaFX 是 Swing 的完全替代品吗?

java - 了解多模块应用中的 CDI/Weld

regex - 保留结构数据以备后用

javascript - 如何显示用户 discord.js/userinfo 命令的角色

bots - 如何结束机器人对话并让真人处理 Dialogflow 中的响应?

heroku - 如何在 heroku 上使用音乐不和谐机器人播放声音

java - 捕获图像并仅将它们存储在android中的apk中?