2014-05-20 66 views
0

我有几个字符串,看起来像最好的办法这样一条:如何解析这个字符串中

\r\n\t\StaticWord1:\r\n\t\t2014-05-20 11:03\r\n\t\StaticWord2\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\tWordC WordD\r\n\t\t\t\t\t\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t 

我想获得的日期(2014-05-20 11:03在我的例子 - 但是会有所不同),Word CD 。 (CD都可以是任意字母序列)。

我如何解析这个尽可能高效?我正在考虑使用String.Replace方法,但我认为正则表达式会更好? (C#)

+0

请问你StaticWords和Word C和d有什么不同? – thefourtheye

+0

WordC和WordD可以是任何单词。 StaticWord1和StaticWord2总是相同的单词。 – mdc

+0

字符串中是否真的有'\ S',还是'\\ S'? – Robin

回答

0
string input = @"\r\n\t\StaticWord1:\r\n\t\t2014-05-20 11:03\r\n\t\StaticWord2\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\tWordC WordD\r\n\t\t\t\t\t\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t"; 

string pattern = @"(\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2})(?:[\\r\\n\\t]*StaticWord2[\\r\\n\\t]*)(\w+)\s(\w+)"; 

Match match = Regex.Match(input, pattern); 

然后得到的值:

match.Groups[1].Value; // date-time 
match.Groups[2].Value; // WordC 
match.Groups[3].Value; // WordD 
2

使用此捕获字符串:

Match match = Regex.Match(input, @"(\d\d\d\d-\d\d-\d\d \d\d:\d\d)", 
    RegexOptions.Multiline); 
if (match.Success) 
{ 
    string key = match.Groups[1].Value; 
    DateTime date = DateTime.ParseExact(key, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture); // Your result is here 
} 
+0

您的一般想法(使用正则表达式进行解析)很好(得分),但请注意,有些系统可能生成的日期值在.NET中不可能被解析为DateTime(例如:SAP可能会提供像这样的日期“ 0000-00-00“,类似的问题可能发生在MySQL DB(”0000-00-00 00:00:00“),...)。因此,请注意您正在尝试解析的内容,并确保您正确处理狭义案例。 Mdc没有指定此日期的来源,默认情况下使用DateTime.ParseExact可能不是最好的想法... – st4hoo

2

我不知道这是否是最好的方式,但你可以在这个MSDN例如使用拆分,如: http://msdn.microsoft.com/en-us/library/ms228388.aspx

有了这个例子你可以很容易地创建一个数组比如上例中,用\ t \ n个分割你的字符串\ r ...,用循环得到所有你的话:

class TestStringSplit 
{ 
    static void Main() 
    { 
     char[] delimiterChars = { '\r', '\n', '\t' }; 

     string text = "\r\n\t\StaticWord1:\r\n\t\t2014-05-20 11:03\r\n\t\StaticWord2\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\tWordC WordD\r\n\t\t\t\t\t\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t"; 
     System.Console.WriteLine("Original text: '{0}'", text); 

     string[] words = text.Split(delimiterChars); 
     System.Console.WriteLine("{0} words in text:", words.Length); 

     foreach (string s in words) 
     { 
      System.Console.WriteLine(s); 
     } 

     // Keep the console window open in debug mode. 
     System.Console.WriteLine("Press any key to exit."); 
     System.Console.ReadKey(); 
    } 
}