using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
private static readonly Dictionary<string, string> Pieces = new Dictionary<string, string>
{
{ "month", @"(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)" },
{ "day", @"\d+" },
{ "hour", @"\d+" },
{ "the_rest", @".*" },
};
public static void Main()
{
var str = "JAN 01 00:00:01 <Admin> Action, May have spaces etc.";
var format = "{month} {day} {hour}:{the_rest}";
var results = Parse(str, format);
if (results == null) {
Console.WriteLine("Regex did not match");
return;
}
foreach(var name in Pieces.Keys) {
Console.WriteLine(string.Format("{0} = {1}", name, results[name]));
}
}
public static IDictionary<string, string> Parse(string input, string format)
{
var re = Regex.Replace(format,
@"\{(\w+)\}",
m => string.Format("(?<{0}>{1})", m.Groups[1].Value, Pieces[m.Groups[1].Value]));
var regex = new Regex("^" + re + "$", RegexOptions.ExplicitCapture);
var match = regex.Match(input);
return match.Success
? regex.GetGroupNames().ToDictionary(n => n, n => match.Groups[n].Value)
: null;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IFBpZWNlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPgoJewoJCXsgIm1vbnRoIiwgQCIoSkFOfEZFQnxNQVJ8QVBSfE1BWXxKVU58SlVMfEFVR3xTRVB8T0NUfE5PVnxERUMpIiB9LAoJCXsgImRheSIsIEAiXGQrIiB9LAoJCXsgImhvdXIiLCBAIlxkKyIgfSwKCQl7ICJ0aGVfcmVzdCIsIEAiLioiIH0sCgl9OwoKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQl2YXIgc3RyID0gIkpBTiAwMSAwMDowMDowMSA8QWRtaW4+IEFjdGlvbiwgTWF5IGhhdmUgc3BhY2VzIGV0Yy4iOwoJCXZhciBmb3JtYXQgPSAie21vbnRofSB7ZGF5fSB7aG91cn06e3RoZV9yZXN0fSI7CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBQYXJzZShzdHIsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCJSZWdleCBkaWQgbm90IG1hdGNoIik7CgkJCXJldHVybjsKCQl9CgoJCWZvcmVhY2godmFyIG5hbWUgaW4gUGllY2VzLktleXMpIHsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoc3RyaW5nLkZvcm1hdCgiezB9ID0gezF9IiwgbmFtZSwgcmVzdWx0c1tuYW1lXSkpOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBQYXJzZShzdHJpbmcgaW5wdXQsIHN0cmluZyBmb3JtYXQpCgl7CgkJdmFyIHJlID0gUmVnZXguUmVwbGFjZShmb3JtYXQsCgkgICAgICAgIAkgICAgICAgICAgICAgICBAIlx7KFx3KylcfSIsCgkgICAgICAgICAgICAgICAgCSAgICAgICBtID0+IHN0cmluZy5Gb3JtYXQoIig/PHswfT57MX0pIiwgbS5Hcm91cHNbMV0uVmFsdWUsIFBpZWNlc1ttLkdyb3Vwc1sxXS5WYWx1ZV0pKTsKCQl2YXIgcmVnZXggPSBuZXcgUmVnZXgoIl4iICsgcmUgKyAiJCIsIFJlZ2V4T3B0aW9ucy5FeHBsaWNpdENhcHR1cmUpOwoJCXZhciBtYXRjaCA9IHJlZ2V4Lk1hdGNoKGlucHV0KTsKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaC5TdWNjZXNzCgkJCT8gcmVnZXguR2V0R3JvdXBOYW1lcygpLlRvRGljdGlvbmFyeShuID0+IG4sIG4gPT4gbWF0Y2guR3JvdXBzW25dLlZhbHVlKQoJCQk6IG51bGw7Cgl9Cn0=