用正则表达式解析

时间:2014-04-03 09:16:07

标签: c# regex

我一直在寻找一个很好的指南,但我无法弄清楚正则表达式的语法。

我需要解析以下字符串:

  

[2013.11.22 22:50:30]系统>姓氏姓氏被踢了   主持人

我需要提取的变量应该看起来像这样:

[ <yyyy>.<MM>.<dd> <hh>:<mm>:<ss> ] System > <username> was kicked by <moderatorname>

所以,基本上是时间戳,谁被谁(字母数字名称)踢了。这是令我困惑的一点。用户名和主持人的姓名都可能是 2个甚至3个部分除以空格......可能我猜用户名可能是“被踢了”,这肯定会搞砸解析。

之前我没有做过很多正则表达式,所以我在语法上并不擅长。看一些指南我到目前为止:

string text = "[ 2013.11.22 22:50:30 ] System > Firstname Surname was kicked by Moderator"
var input = text.ToLower();

Match m = Regex.Match(input, @"(?i:\[\s)(?<year>\d{4})\.(?<month>\d{1,2})\.(?<day>\d{1,2})\s(?<hour>\d{1,2})\:(?<minute>\d{1,2})\:(?<second>\d{1,2})\s\]");

这适用于解析时间戳,但后面的文本部分给了我一些麻烦。我真的不确定如何处理这个问题。

感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:2)

使用它:

\[\s*(?<yyyy>\d+)\.(?<MM>\d+)\.(?<dd>\d+)\s+(?<hh>\d+)\:(?<mm>\d+)\:(?<ss>\d+)\s+\] System > (?<username>.+) was kicked by (?<moderatorname>\w+)

演示:

http://regex101.com/r/kU2xA8

答案 1 :(得分:1)

您可能只想使用正则表达式,如果是这样,那么公平。否则,我可以建议这对于日期部分可能更简单。

string date = "2013.11.22 22:50:30";

DateTime dateTime = DateTime.ParseExact(date , "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

或使用DateTime.Parse(),如果格式不太确定。

我会看一下一个大的正则表达式,但我的方法是用正则表达式拾取用户名,如下所示:

System > (((?!System|\swas).)+)\swas (whoops, I'm picking up addition things)

(?<=kicked by).*