将字符串拆分为某些部分

时间:2009-12-19 20:37:19

标签: c# regex string

我需要创建一种简单的方法将一些字符串拆分为格式化的字符串,例如,我有这个字符串

":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完成,但我不确定。请帮忙! 〜代码示例请

3 个答案:

答案 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命令有两个)之前有多个单个单词