【问题标题】:How do I extract username from string?如何从字符串中提取用户名?
【发布时间】:2020-08-24 17:07:14
【问题描述】:

我一直在使用我为我的不和谐机器人写的这段代码:

Pattern pattern = Pattern.compile("\\/setNickname ([^\\s]+)");
        Matcher matcher = pattern.matcher(messageReceivedEvent.getMessage().getContentRaw());

        boolean foundMatch = matcher.find();
        if (foundMatch && matcher.groupCount() > 0) {
            String discordUserId = messageReceivedEvent.getAuthor().getId();
            String extractedName = matcher.group(1);

根据用户输入频道的文本更改昵称,格式如下: [HH:MM:SS] /setNickname Bill

此代码可以正常工作。但是,我现在想更改它,但我似乎无法让正则表达式模式适用于新格式的消息。它始终是玩家必须输入带有时间戳的消息,因此条目将是: [HH:MM:SS] Bill 4cYaUTKzT2odRf2

在某个时候,我计划在此基础上构建并使其成为变量,因此在第二个空格之前和之后消除似乎是最合乎逻辑的选择,但我正在努力解决这个问题。

输入将是:[HH:MM:SS] Bill 4cYaUTKzT2odRf2

输出应该只是:Bill

任何帮助将不胜感激!

【问题讨论】:

  • 你想要的输出是什么?
  • 能否提供输入输出示例
  • 对不起,我把输出分开了。输出应该只是比尔。我认为这会很接近吗? .*(]\s)(.*)(\s).* 带有 matcher.group(2) 但我不确定。
  • 怎么样:^\[[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\] (\S+)regex101

标签: java regex expression


【解决方案1】:

使用这个正则表达式([A-Z:\\[\\]]+\\s)([A-Za-z]+)(\\s[0-9A-Za-z]+)

    public static void main(String[] args) {
        String input = "[HH:MM:SS] Bill 4cYaUTKzT2odRf2";
        Pattern pattern = Pattern.compile("([A-Z:\\[\\]]+\\s)([A-Za-z]+)(\\s[0-9A-Za-z]+)");
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println(matcher.group(2));
        }
    }

,输出

Bill

,或正则表达式([0-9:\\[\\]]+\\s)([A-Za-z]+)(\\s[0-9A-Za-z]+)

    public static void main(String[] args) {
        String input = "[10:30:10] Bill 4cYaUTKzT2odRf2";
        Pattern pattern = Pattern.compile("([0-9:\\[\\]]+\\s)([A-Za-z]+)(\\s[0-9A-Za-z]+)");
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));
            System.out.println(matcher.group(3));
        }
    }

【讨论】:

  • 感谢这个方法很好用。我也很高兴能够在预先执行代码的同时看到这些组。实时与 Discord 机器人混在一起很痛苦。
【解决方案2】:

也许输入中的可变性比您所指出的要多,但这不起作用:

String input = "[HH:MM:SS] Bill 4cYaUTKzT2odRf2";
String extractedName = input.replaceAll(".+\\s([A-Za-z]+)\\s.+", "$1");
System.out.println(extractedName);

输出:

Bill

【讨论】:

  • 这个方法也有效,我投了赞成票,但我还没有 15 名声望,所以没有显示。感谢您的回复和思考过程。随着代码的进展,我可能需要利用它。我没有考虑将字符串分配给变量的能力。
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 2012-03-03
  • 2020-07-24
  • 1970-01-01
  • 2020-11-20
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多