使用Lambda表达式的正则表达式

时间:2014-02-12 17:16:46

标签: c# regex lambda

我有几个文本文件应该以制表符分隔,但实际上是由任意数量的空格分隔。我想将文本文件中的行解析为DataTable(文本文件的第一行包含属性名称的标题)。这让我想到了构建一个可扩展,简单的方法来解析文本文件。这是我目前的工作解决方案:

string filePath = @"C:\path\lowbirthweight.txt";
            //regex to remove multiple spaces
            Regex regex = new Regex(@"[ ]{2,}", RegexOptions.Compiled);
            DataTable table = new DataTable();
            var reader = ReadTextFile(filePath); 
            //headers in first row
            var headers = reader.First();
            //skip headers for data
            var data = reader.Skip(1).ToArray();
            //remove arbitrary spacing between column headers and table data
            headers = regex.Replace(headers, @" ");
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = regex.Replace(data[i], @" ");
            }
            //make ready the DataTable, split resultant space-delimited string into array for column names
            foreach (string columnName in headers.Split(' '))
            {
                table.Columns.Add(new DataColumn() { ColumnName = columnName });
            }
            foreach (var record in data)
            {
                //split into array for row values
                table.Rows.Add(record.Split(' '));
            }
            //test prints correctly to the console
            Console.WriteLine(table.Rows[0][2]);
        }
        static IEnumerable<string> ReadTextFile(string fileName)
        {
            using (var reader = new StreamReader(fileName))
            {
                while (!reader.EndOfStream)
                {
                    yield return reader.ReadLine();
                }
            }
        }

在我的项目中,我已经收到了几个大型(演出+)文本文件,这些文件的格式不是它们所声称的格式。所以我可以看到必须有一些规律性地编写这些方法,尽管有不同的正则表达式。有没有办法做类似的事情 data =data.SmartRegex(x => x.AllowOneSpace)我可以使用正则表达式迭代字符串集合吗?

在正确的轨道上是否有以下内容?

public static class SmartRegex
    {
        public static Expression AllowOneSpace(this List<string> data)
        {
            //no idea how to return an expression from a method
        }
    }

我不太关心性能,只是想看看这样的东西是如何工作的

1 个答案:

答案 0 :(得分:2)

您应该咨询数据源并找出数据不良的原因。

至于您尝试实施的API设计:

public class RegexCollection
{
    private readonly Regex _allowOneSpace = new Regex(" ");

    public Regex AllowOneSpace { get { return _allowOneSpace; } }
}

public static class RegexExtensions
{
    public static IEnumerable<string[]> SmartRegex(
        this IEnumerable<string> collection,
        Func<RegexCollection, Regex> selector
    )
    {
        var regexCollection = new RegexCollection();
        var regex = selector(regexCollection);
        return collection.Select(l => regex.Split(l));
    }
}

用法:

var items = new List<string> { "Hello world", "Goodbye world" };

var results = items.SmartRegex(x => x.AllowOneSpace);