Java-如何使用正则表达式解析此字符串

Java-如何使用正则表达式解析此字符串,java,regex,string,parsing,Java,Regex,String,Parsing,我有这个字符串,我想解析它。通常我会使用string.split(),但它有点复杂,所以我认为在这种情况下使用正则表达式更好。但我不太熟悉正则表达式。也许你们可以帮我 我的字符串如下所示: PING :sendak.freenode.net 还是像这样 :username!~user@hostname.tld PRIVMSG #channelname :test 并且应该被解析为它的组件前缀、用户名、命令、频道、文本 例如: PING :sendak.freenode.net 应该是:

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

我的字符串如下所示:

PING :sendak.freenode.net
还是像这样

:username!~user@hostname.tld PRIVMSG #channelname :test
并且应该被解析为它的组件前缀、用户名、命令、频道、文本

例如:

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"));
    }
}

你到底想解析出什么?您尝试过或尝试过什么?有许多解决方案可以解决您的问题,但这里有一个可能的解决方案:使用来自的Splitter类。你应该试着一次拆分一行。当
split()
接受一个正则表达式时,
split()
怎么会比正则表达式更复杂呢?我不想删掉一些东西。上面我有两条示例消息,下面的一行是应该如何解析它。我目前的尝试很差,而且不起作用。我基本上从“:”开始拆分,然后在空格处拆分结果数组的最后一个元素。然后我停了下来,因为我在一行的开头遇到了:的问题。@c-pid听起来似乎比正则表达式更能使用解析器。可能比解决角落里的案子容易,但我不知道。。。