0

我希望能够使用 c# 中的正则表达式匹配并提取以下字符串中的所有子字符串:

"2012-05-15 00:49:02 192.168.100.10 POST /Microsoft-Server-ActiveSync/default.eas User=nikced&DeviceId=ApplDNWGRKZQDTC0&DeviceType=iPhone&Cmd=Ping&Log=V121_Sst8_LdapC0_LdapL0_RpcC31_RpcL50_Hb3540_Erq1_Pk1728465481_S2_ 443 redcloud\nikced 94.234.170.42 Apple-iPhone4C1/902.179 200 0 64 3140491"

由于它是一个日志文件,因此正则表达式应该能够处理任何类似类型的行。

在这种情况下,集合的首选输出应该是:

2012-05-15
00:49:02
192.168.100.10
/Microsoft-Server-ActiveSync/default.eas
User=nikced&DeviceId=ApplDNWGRKZQDTC0&DeviceType=iPhone&Cmd=Ping&Log=V121_Sst8_LdapC0_LdapL0_RpcC31_RpcL50_Hb3540_Erq1_Pk1728465481_S2_
443
redcloud\nikced
94.234.170.42
Apple-iPhone4C1/902.179
200
0
64
3140491

感谢使用 C#、.net 和正则表达式将上述子字符串提取到集合中的任何答案(首选 MatchCollection)。所有日志行都遵循相同的格式和模式。

4

5 回答 5

3

令人难以置信的复杂正则表达式传入:

logFile.Split(' ');
于 2012-05-18T14:38:43.493 回答
1

您不需要使用正则表达式。您可以简单地使用String.Split 方法,并指定空格作为分隔符:

  string [] substrings = line.Split(new Char [] {' '});

如果您需要识别每个部分的种类,那么您应该指定您需要查找的内容,并且可以为其创建一个正则表达式。

无论如何,如果您真的想使用正则表达式,请执行以下操作:

  Regex re = new Regex (@"(?:(?<s>[^ ]+)(?: |$))*");

当您调用 Match 方法时,这将为您提供“s”组中的所有捕获。

正如 OP 在评论中指出的那样,分隔符可以是来自单个空间的任何东西,那么可能的分隔符应该包含在表达式的(?: |$)and[^ ]部分中。即,如果空格和制表符是可能的分隔符,则将该部分替换为(?: |\t|$)and [^ \t]。如果您需要接受多个这些字符作为分隔符,+请在组后添加一个()

  (?:(?<s>[^ \t]+)(?: |\t|$)+)*
于 2012-05-18T14:45:37.497 回答
1

这将为您提供一个数组,您可以遍历该数组以检索由空格分隔的所有“行”

string[] lines = log.Split(' ');
于 2012-05-18T14:40:35.520 回答
0

真的,你只需要把它分解成几个部分。

首先,日期。它会一直是 YYYY-MM-DD 格式吗?有没有可能根据地区/文化设置而有所不同?

(?<LogDate>dddd-dd-dd)

接下来,你有时间。一样:

(?<LogTime>dd:dd:dd)

接下来,我假设这是实际调用的 Web 方法?不完全确定,因为您还没有真正解释数据的布局方式。但是,我假设它要么是 POST 要么是 GET,所以这就是我们接下来要做的......

(?<LogMethod>POST|GET)

只需对您感兴趣的日志行的每个部分执行此操作,您就会被设置。IE:

(?<LogDate>dddd-dd-dd) (?<LogTime>dd:dd:dd) (?<LogMethod>POST|GET)...

如果要锚定到行的开头/结尾,请务必分别使用 ^ 和 $。当您获取匹配项时,您可以通过使用命名组(例如match.Groups["LogMethod"].Value)索引 Groups 属性来获取每个组的值。祝你好运!

于 2012-05-18T15:12:57.923 回答
0

最快和最明显的方法是使用String.Split

string[] substrings = result = line->Split( nullptr, StringSplitOptions::RemoveEmptyEntries );

但是如果你坚持 aMatchCollection那么这会做你想做的

MatchCollection ^ substrings = Regex.Matches(line, "\\S+")
于 2012-05-18T15:08:01.387 回答