2011-01-08 17 views
1

我有的像在下面的例子中生成的输入字符串:提取多个值从一个字符串与正则表达式

string.Format("Document {0}, was saved by {1} on {2}. The process was completed 
{3} milliseconds and data was received.", 
"Document.docx", "John", "1/1/2011", 45); 

它生成字符串如下所示然后:

Document Document.docx, was saved by John on 1/1/2011. The process was completed 
45 milliseconds and data was received. 

一旦这样的字符串是从不同的应用程序接收到,使用正则表达式解析什么是最简单的方法,并从中提取值Document.docx,John,1/1/2011,45

我正在寻找最简单的方法来做到这一点,因为我们将不得不分析一些不同的输入字符串。

回答

7

你可以使用这样的事情:

private static readonly Regex pattern = 
    new Regex("^Document (?<document>.*?), was saved by (?<user>.*?) on " + 
     "(?<date>.*?)\\. The process was completed (?<duration>.*?) " + 
     "milliseconds and data was received\\.$"); 

public static bool MatchPattern(
    string input, 
    out string document, 
    out string user, 
    out string date, 
    out string duration) 
{ 
    document = user = date = duration = null; 

    var m = pattern.Match(input); 
    if (!m.Success) 
     return false; 

    document = m.Groups["document"].Value; 
    user = m.Groups["user"].Value; 
    date = m.Groups["date"].Value; 
    duration = m.Groups["duration"].Value; 

    return true; 
} 

这可能是值得的重构返回一个包含所有的信息,你想要的,而不是使用out参数的复合型。但这种方法应该仍然有效。

若要使用此代码,你会做这样的事情:

var input = "..."; 

string document, user, date, duration; 
if (MatchPattern(input, out document, out user, out date, out duration)) { 
    // Match was successful. 
} 
+0

6分钟!哇,这真棒谢谢! – 2011-01-08 18:24:19

相关问题