Java - 如何使用 RegEx 解析此字符串

标签 java regex string parsing

所以我有这个字符串,我想解析它。通常我会使用 string.split() ,但它有点复杂,所以我认为在这种情况下使用正则表达式可能更好。但我对正则表达式不太熟悉。也许你们女孩/男孩可以帮助我。

我的字符串看起来像这样:

PING :sendak.freenode.net

或者像这样

:username!~user@hostname.tld PRIVMSG #channelname :test

并且应该被解析成它的组件前缀、用户名、命令、 channel 、文本。

示例:

PING :sendak.freenode.net 

应该是:

prefix=[] username=[] command=[PING] channel=[] text=[sendak.freenode.net]

和字符串:

:username!~user@hostname.tld PRIVMSG #channelname :test

应解析为:

prefix=[username!~user@hostname.tld] username=[username] command=[PRIVMSG] channel=[#channelname] text=[test]

最后我必须填写这些变量:

message.prefix = "";
message.username = "";
message.command = "";
message.channel = "";
message.text = "";

我一次分割一行!

很明显,这将是一个小型的 IRC 聊天。

我遇到的问题是它可以以“:”开头,但不一定如此。因此,使用多个 split() 来实现变得相当复杂。

感谢您的帮助!

最佳答案

我认为这个正则表达式可能会帮助你:"(:?((.)![^ ]))?([^ ]) (#([^ ]) )?(:(.*))?":

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Message{
    public String prefix = "";
    public String userName = "";
    public String command = "";
    public String channel = "";
    public String text = "";

    public Message(String line){
        Matcher matcher = Pattern.compile("(:?((.*)![^ ]*))? ?([^ ]*) (#([^ ]*) )?(:(.*))?").matcher(line);
        if (matcher.matches()){
            prefix = matcher.group(2) != null? matcher.group(2): "";
            userName = matcher.group(3) != null? matcher.group(3): "";
            command = matcher.group(4) != null? matcher.group(4): "";
            channel = matcher.group(6) != null? matcher.group(6): "";
            text = matcher.group(8) != null? matcher.group(8): "";
        }
    }

    @Override
    public String toString() {
        return String.format("prefix=[%s] username=[%s] command=[%s] channel=[%s] text=[%s]", prefix, userName, command, channel, text);
    }
}


public class TestRegex {

    public static void main(String[] args) {
        System.out.println(new Message("PING :sendak.freenode.net"));
        System.out.println(new Message(":username!~user@hostname.tld PRIVMSG #channelname :test"));
        System.out.println(new Message("username!~user@hostname.tld PRIVMSG #channelname :test"));
    }
}

关于Java - 如何使用 RegEx 解析此字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747866/

相关文章:

java - 我试图访问 config.properties 文件但无法访问。谁能帮我?

java - 如何时时获取Firebase上的数据?

java - executeUpdate() 不添加字符串变量

java - 带下划线的 RegEx 验证名称

javascript - jQuery:将文件类型类添加到任何文件类型的链接

python - 解析具有已知键定界符的键值对的字符串

java - 多次单击按钮后小型 Swing 应用程序崩溃

输入文本上的 Javascript 文本输入将格式更改为小数点后两位

c - 从控制台读取正好 50 个字符(49 +1 表示 null),仅忽略所有初始空格

javascript - 使用函数和循环拼接字符串值并存储为数组