在C#中解析多行字符串

时间:2014-09-06 02:19:47

标签: c# parsing

我有一个看起来像这样的字符串:

TYPE Email Forwarding

SIGNATURE mysig.html

COMPANY Smith Incorp

CLIENT NAME James Henries

... heaps of others ....

我需要获取Type,Signature,Company和Client Name的值。还有其他人,但是一旦我能找到关于如何做这些的话,我可以做其余的事情。我试图拆分和修剪字符串,但之后它会分割像CLIENT NAME这样的字段或像电子邮件转发这样的值。

2 个答案:

答案 0 :(得分:2)

我会把所有的"键"将值转换为集合,然后将该字符串解析为另一个集合,然后比较集合的值。

以下是如何获取值的大致概述:

    static void Main(string[] args)
    {
        //Assuming that you know all of the keys before hand
        List<string> keys = new List<string>() { "TYPE", "SIGNATURE", "COMPANY", "CLIENT NAME" };

        //Not sure of the origin of your string to parse.  You would have to change
        //this to read a file or query the DB or whatever
        string multilineString =
            @"TYPE Email Forwarding

            SIGNATURE mysig.html

            COMPANY Smith Incorp

            CLIENT NAME James Henries";

        //Split the string by newlines.
        var lines = multilineString.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

        //Iterate over keys because you probably have less keys than data in the event of duplicates
        foreach (var key in keys)
        {
            //Reduce list of lines to check based on ones that start with a given key
            var filteredLines = lines.Where(l => l.Trim().StartsWith(key)).ToList();

            foreach (var line in filteredLines)
            {
                Console.WriteLine(line.Trim().Remove(0, key.Length + 1));
            }
        }

        Console.ReadLine();
    }

答案 1 :(得分:0)

这将完成你的工作。

如果它是多行,那么你可以遍历每一行并调用KeyValue扩展方法,如下所示:

 public static class Program
    {
        public static void Main()
        {
            var value = "TYPE Email Forwarding".KeyValue();
            var value1 = "CLIENT NAME James Henries".KeyValue();

        }

        public static KeyValuePair<string, string> KeyValue(this string rawData)
        {
            var splitValue = rawData.Split(new[] { ' ' }, System.StringSplitOptions.RemoveEmptyEntries);
            KeyValuePair<string, string> returnValue;

            var key = string.Empty;
            var value = string.Empty;
            foreach (var item in splitValue)
            {
                if (item.ToUpper() == item)
                {
                    if (string.IsNullOrWhiteSpace(key))
                    {
                        key += item;
                    }
                    else
                    {
                        key += " " + item;
                    }
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(value))
                    {
                        value += item;
                    }
                    else
                    {
                        value += " "  + item;
                    }
                }
            }

            returnValue = new KeyValuePair<string, string>(key, value);
            return returnValue;
        }
    }

请注意,只有当键全部为高位并且值不是全部大写时,此逻辑才有效。否则,无法识别哪一个是键(没有键上的手动轨道),哪一个不是。