所以我有这个字符串,我想解析它。通常我会使用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聊天。
我遇到的问题是它可以以“:”开头,但不一定。因此,使用多个splits()实现相当复杂。
感谢您的帮助!
答案 0 :(得分:1)
我认为这个正则表达式可以帮到你:“(:?((。)![^] ))??([^] )(#([^ ] ))?(:(。*))?“:
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"));
}
}