正则表达式与文本C#匹配?

时间:2012-12-29 04:48:42

标签: c# .net regex

我正在阅读一个包含以下内容的日志文件

DateTime: 2012-12-09 17:00:18
Command: ALTER INDEX [XPKAttribute] ON [FMC360Train_MSCRM].[MetadataSchema].[Attribute] REORGANIZE WITH (LOB_COMPACTION = ON)
Comment: ObjectType: Table, IndexType: Clustered, ImageText: No, NewLOB: No, FileStream: No, AllowPageLocks: Yes, PageCount: 1336, Fragmentation: 10.1796
Outcome: Succeeded
Duration: 00:00:01
DateTime: 2012-12-09 17:00:19

DateTime: 2012-12-09 17:00:19
Command: ALTER INDEX [XPKLocalizedLabel] ON [FMC360Train_MSCRM].[MetadataSchema].[LocalizedLabel] REORGANIZE WITH (LOB_COMPACTION = ON)
Comment: ObjectType: Table, IndexType: Clustered, ImageText: No, NewLOB: Yes, FileStream: No, AllowPageLocks: Yes, PageCount: 2522, Fragmentation: 18.5964
Outcome: Succeeded
Duration: 00:00:01
DateTime: 2012-12-09 17:00:20

这里是正在使用的正则表达式代码

var data = new Regex(@"^DateTime:\ (?<StartTime>[^\r]+)\r\nCommand: ALTER INDEX\ (?<Command>[^\r]+)\r\nComment:\ (?<Comment>[^\r]+)\r\nOutcome:\ (?<Outcome>[^\r]+)\r\nDuration:\ (?<Duration>[^\r]+)\r\nDateTime:\ (?<EndTime>[^\r]+)", RegexOptions.Multiline)
                .Matches(File.ReadAllText(@"C:\Users\dalvi\Desktop\Index Logs\trial.txt")).Cast<Match>().Select(m => new
                {
                    StartTime = m.Groups["StartTime"].Value,
                    Command = m.Groups["Command"].Value,
                    Comment = m.Groups["Comment"].Value,
                    Outcome = m.Groups["Outcome"].Value,
                    Duration = m.Groups["Duration"].Value,
                    EndTime = m.Groups["EndTime"].Value
                });

但输出我在Command:和Comment之后得到全文:但我想要 ON后的文本表示[FMC360Train_MSCRM]。[MetadataSchema]。[LocalizedLabel]然后将下一个文本REORGANIZE作为不同的值,如何修改正则表达式代码以获得输出

StartTime   DBTableName Type    Comment Outcome Duration    EndTime
2012-12-09 17:00:18 [FMC360Train_MSCRM].[MetadataSchema].[Attribute]    REORGANIZE  PageCount: 1336 Succeeded   00:00:01    2012-12-09 17:00:19

我的程序正在努力获得长输出,但我想要输出以上格式,所以我需要帮助 只在正则表达式上。

1 个答案:

答案 0 :(得分:1)

我不知道解析Command行的确切规则,但以下正则表达式适用于您的两个示例输入:

var data = new Regex(@"^DateTime:\ (?<StartTime>[^\r]+)\r\nCommand: ALTER INDEX \[([^\]]+)\] ON (?<DBTableName>\[([^\]]+)\]\.\[([^\]]+)\]\.\[([^\]]+)\]) (?<Type>[^ ]+) ([^\r]+)\r\nComment:\ (?<Comment>.+Fragmentation: (?<Fragmentation>[\d\.]+)[^\r]+)\r\nOutcome:\ (?<Outcome>[^\r]+)\r\nDuration:\ (?<Duration>[^\r]+)\r\nDateTime:\ (?<EndTime>[^\r]+)", RegexOptions.Multiline)
    .Matches(File.ReadAllText(@"C:\Users\dalvi\Desktop\Index Logs\trial.txt")).Cast<Match>().Select(m => new
        {
            StartTime = m.Groups["StartTime"].Value,
            DBTableName = m.Groups["DBTableName"].Value,
            Type = m.Groups["Type"].Value,
            Comment = m.Groups["Comment"].Value,
            Fragmentation = m.Groups["Fragmentation"].Value,
            Outcome = m.Groups["Outcome"].Value,
            Duration = m.Groups["Duration"].Value,
            EndTime = m.Groups["EndTime"].Value
        });

编辑:

以下是运行在测试数据上的完整控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        string input =
            @"DateTime: 2012-12-09 17:00:18
Command: ALTER INDEX [XPKAttribute] ON [FMC360Train_MSCRM].[MetadataSchema].[Attribute] REORGANIZE WITH (LOB_COMPACTION = ON)
Comment: ObjectType: Table, IndexType: Clustered, ImageText: No, NewLOB: No, FileStream: No, AllowPageLocks: Yes, PageCount: 1336, Fragmentation: 10.1796
Outcome: Succeeded
Duration: 00:00:01
DateTime: 2012-12-09 17:00:19

DateTime: 2012-12-09 17:00:19
Command: ALTER INDEX [XPKLocalizedLabel] ON [FMC360Train_MSCRM].[MetadataSchema].[LocalizedLabel] REORGANIZE WITH (LOB_COMPACTION = ON)
Comment: ObjectType: Table, IndexType: Clustered, ImageText: No, NewLOB: Yes, FileStream: No, AllowPageLocks: Yes, PageCount: 2522, Fragmentation: 18.5964
Outcome: Succeeded
Duration: 00:00:01
DateTime: 2012-12-09 17:00:20";

        var data = new Regex(@"^DateTime:\ (?<StartTime>[^\r]+)\r\nCommand: ALTER INDEX \[([^\]]+)\] ON (?<DBTableName>\[([^\]]+)\]\.\[([^\]]+)\]\.\[([^\]]+)\]) (?<Type>[^ ]+) ([^\r]+)\r\nComment:\ (?<Comment>.+Fragmentation: (?<Fragmentation>[\d\.]+)[^\r]+)\r\nOutcome:\ (?<Outcome>[^\r]+)\r\nDuration:\ (?<Duration>[^\r]+)\r\nDateTime:\ (?<EndTime>[^\r]+)", RegexOptions.Multiline)
            .Matches(input).Cast<Match>().Select(m => new
            {
                StartTime = m.Groups["StartTime"].Value,
                DBTableName = m.Groups["DBTableName"].Value,
                Type = m.Groups["Type"].Value,
                Comment = m.Groups["Comment"].Value,
                Fragmentation = m.Groups["Fragmentation"].Value,
                Outcome = m.Groups["Outcome"].Value,
                Duration = m.Groups["Duration"].Value,
                EndTime = m.Groups["EndTime"].Value
            });

        foreach (var datum in data)
        {
            Console.WriteLine("StartTime: {0}", datum.StartTime);
            Console.WriteLine("DBTableName: {0}", datum.DBTableName);
            Console.WriteLine("Type: {0}", datum.Type);
            Console.WriteLine("Comment: {0}", datum.Comment);
            Console.WriteLine("Fragmentation: {0}", datum.Fragmentation);
            Console.WriteLine("Outcome: {0}", datum.Outcome);
            Console.WriteLine("Duration: {0}", datum.Duration);
            Console.WriteLine("EndTime: {0}", datum.EndTime);
            Console.WriteLine();
        }

        Console.ReadKey();
    }
}

这是它的输出:

StartTime: 2012-12-09 17:00:18
DBTableName: [FMC360Train_MSCRM].[MetadataSchema].[Attribute]
Type: REORGANIZE
Comment: ObjectType: Table, IndexType: Clustered, ImageText: No, NewLOB: No, FileStream: No, AllowPageLocks: Yes, PageCount: 1336, Fragmentation: 10.1796
Fragmentation: 10.179
Outcome: Succeeded
Duration: 00:00:01
EndTime: 2012-12-09 17:00:19

StartTime: 2012-12-09 17:00:19
DBTableName: [FMC360Train_MSCRM].[MetadataSchema].[LocalizedLabel]
Type: REORGANIZE
Comment: ObjectType: Table, IndexType: Clustered, ImageText: No, NewLOB: Yes, FileStream: No, AllowPageLocks: Yes, PageCount: 2522, Fragmentation: 18.5964
Fragmentation: 18.596
Outcome: Succeeded
Duration: 00:00:01
EndTime: 2012-12-09 17:00:20
相关问题