Regex messageServerRegex =
new Regex(@"([0-9\-]{10})\ ([0-9:]{8})\ \[TEXT\]\ (\[Server\])\ ([^\[]*)");
if (messageServerRegex.IsMatch(rchConsoleText))
{
var infoMatches = messageServerRegex.Split(rchConsoleText);
Console.WriteLine("Date: {0}\nTime: {1}\nType: {2}\nMessage: {3}",
infoMatches[1], infoMatches[2], infoMatches[3], infoMatches[4]);
}
以下是我们希望服务器过滤的文本的两个示例
2012-12-24 02:24:18 [文字] [服务器] 2012-12-24 02:24:18 [文字] [服务器]示例文字。
我们希望从这一行返回的结果是:
Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: 2012-12-24 02:24:18 [TEXT] [Server] Sample text.
但它会回复:
Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: 2012-12-24 02:24:18
正如你所看到的,它只显示了日期和时间,这是因为正则表达式对此进行了过滤,那么如何让它只减少一次日期和时间呢?
第二个例子工作正常,即:
2012-12-24 02:24:18 [TEXT] [服务器]示例文本示例文本示例文本。
我们希望从这一行返回的结果是:
Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: Sample text sample text sample text.
答案 0 :(得分:2)
我无法判断你的输入是否被分成了几行。如果是这样,那就很容易使用匹配。
var inputs = new string[]{
@"2012-12-24 02:24:18 [TEXT] [Server] 2012-12-24 02:24:18 [TEXT] [Server] Sample text.",
@"2012-12-24 02:24:18 [TEXT] [Server] Sample text sample text sample text."};
foreach(string input in inputs)
{
string pattern = @"([0-9\-]{10}) ([0-9:]{8}) \[TEXT\]\ (\[Server\]) (.*)";
var match = Regex.Match(input, pattern);
Console.WriteLine(
"Date: {0}\nTime: {1}\nType: {2}\nMessage: {3}",
match.Groups[1].Value, match.Groups[2].Value, match.Groups[3].Value, match.Groups[4].Value);
}
如果没有,它会变得更加困难 - 而不是.*
它将是((?!something that indicates the next entry).)
答案 1 :(得分:0)
正则表达式中的最后一组不包括'['字符,如果它包含[字符],则会导致该行的文本部分不匹配。如果输入表示单个日志消息,则排除似乎是不必要的。试一试,不要排除,。*,看看是否有效
答案 2 :(得分:0)
怎么样:
^([0-9\-]{10})\ ([0-9:]{8})\s*\[TEXT\]\s*\[Server\]\s*(.*)