我需要创建一种简单的方法将一些字符串拆分为格式化的字符串,例如,我有这个字符串
":JStoker!stoker@jcs.me.uk PRIVMSG #channel :test message"
我需要把它分成:
string nickname = "JStoker"
string ident = "stoker"
string host = "jcs.me.uk"
string channel = "#channel"
string message = "test message"
我需要这样做,如果说我得到一个像
这样的字符串":irc.testnet.com PRIVMSG #channel :test message"
例如,我需要像这样的东西
string nickname = "irc.testnet.com"
string ident = ""
string host = ""
string channel = "#channel"
string message = "test message"
通过相同的事情,没有抛出错误......并且字符串即时使用更改,如果您熟悉这是原始IRC数据..我只需要知道如何有效地解析数据。
可能可以通过Regex完成,但我不确定。请帮忙! 〜代码示例请
答案 0 :(得分:2)
是的,像这样的正则表达式应该这样做:
^:(\w+)(?:!(\w+)@([\w\.]+))? PRIVMSG (#\w+) :(.+)$
示例:
Match m = Regex.Match(input, @"^:(\w+)(?:!(\w+)@([\w\.]+))? PRIVMSG (#\w+) :(.+)$");
string nickname = m.Groups[1].Value;
string ident = m.Groups[2].Value;
string host = m.Groups[3].Value;
string channel = m.Groups[4].Value;
string message = m.Groups[5].Value;
注意:\w
与A-Z a-z 0-9 _匹配,您可能希望使用不同的集合,具体取决于不同标识符可能包含的字符。
答案 1 :(得分:1)
/\"\:(?:(.+)\!(.+)\@)?([^ ]+) PRIVMSG([^ ]+) \:(.+)\"/
$nick = $3
$ident = $1
$host = $2
$chan = $4
$message = $5
我逃脱所有角色只是因为它取决于正则表达式引擎。你应该根据你使用的东西取消那些不特殊的字符
答案 2 :(得分:1)
我为IRC消息拆分做的是(简单来说,因为我不记得C#中的确切代码),是:
对我来说,这种方法比为它创建一个正则表达式更容易,虽然我不确定性能差异(我愿意打赌,如果你只是写一个客户端)
或者你可以这样做:
我不确定哪个“更快”,但我相信第二个不那么优雅。
无论你进入的命令是什么(并且因此可以用于泛型解析),这些都应该工作,并且你必须注意这样一个事实,即并非所有命令都有一个以下列开头的元素:。例如,NICK命令只允许单个单词,并且通常不会通过以下方式进行转义:,其他命令在:( USER命令有两个)之前有多个单个单词