拆分具有奇怪图案的字符串

时间:2014-03-17 16:41:37

标签: c#

我需要帮助来拆分具有相当奇怪模式的字符串集合。

示例数据:

List<string> input = new List<string>();
input.Add("Blue Code \n 03 ID \n 05 Example \n Sky is blue");
input.Add("Green Code\n 01 ID\n 15");
input.Add("Test TestCode \n 99 \n Testing is fun");

预期产出:

For input[0]:
string part1 = "Blue"
string part2 = "Code \n 03"
string part3 = "ID \n 05"
string part4 = "Example \n Sky is blue"

For input[1]:
string part1 = "Green"
string part2 = "Code\n 01"
string part3 = "ID\n 15"

For input[2]:
string part1 = "Test"
string part2 = "TestCode \n 99"
string part3 = "\n Testing is fun"
  
    

再编辑一个例子:

  
"038  038\n 0004  049.0\n 0006"

预期产出:

"038"
"038\n 0004"
"049.0\n 0006"

简而言之,我甚至不知道如何描述模式......似乎我需要在&#34; \ n&#34;之前的第一个字符串(充当键)。作为新字符串的一部分,但最后一个输入[2]与另一个输入[2]略有不同。另外,请注意空格,它们极不一致。

我知道这是一个很长的镜头,但如果有人能弄清楚如何处理这些数据,请告诉我。

  
    

更新:我想我可以忘记解决这个问题...当我真正详细了解数据库时,我发现它不仅仅是\ n,它可以是......任何东西,包括| a | b | c(来自az,AZ),\ a \ b \ c(来自az,AZ)。手动重新输入数据可能会容易得多......

  

2 个答案:

答案 0 :(得分:0)

我会说模式是:

List<string> input = new List<string>();
input.Add("Blue Code \n 03 ID \n 05 Example \n Sky is blue");
input.Add("Green Code\n 01 ID\n 15");
input.Add("Test TestCode \n 99 \n Testing is fun");

foreach(string text in  input)
{
    string rest = text;
    //1 Take first word
    string part1 = rest.Split(' ')[0];
    rest = rest.Skip(part1.Length).ToString();
    //while rest contains (/n number)

    while (rest.Contains("\n"))
    {
        //Take until /n number
        int index = rest.IndexOf("\n");
        string partNa = rest.Take(index).ToString();
        string temp = rest.Skip(index).ToString();
        string partNb = temp.Split(' ')[0];
        int n;
        if (int.TryParse("123", out n))
        {
            string partN = partNa + partNb;
            rest = rest.Skip(partN.Length).ToString();
        }
    }

    //Take rest
    string part3 = rest;
}

它可能写得更优化,但你明白了。

答案 1 :(得分:0)

好的,我有这个小代码片段来生成您正在寻找的输出。模式似乎是:Word [Key \ n Value] [Key \ n Value] [Key \ n Value(with Spaces)] 钥匙可以是空的。是吗?

        var input = new List<string>
        {
            "Blue Code \n 03 ID \n 05 Example \n Sky is blue",
            "Green Code\n 01 ID\n 15",
            "038  038\n 0004  049.0\n 0006",
            "Test TestCode \n 99 \n Testing is fun"
        };

        var output = new List<List<string>>();
        foreach (var item in input)
        {
            var items = new List<string> {item.Split(' ')[0]};

            const string strRegex = @"(?<group>[a-zA-Z0-9\.]*\s*\n\s*[a-zA-Z0-9\.]*)";
            var myRegex = new Regex(strRegex, RegexOptions.None);

            var matchCollection = myRegex.Matches(item.Remove(0, item.Split(' ')[0].Length));

            for (var i = 0; i < 2; i++)
            {
                if (matchCollection[i].Success)
                {
                    items.Add(matchCollection[i].Value);
                }
            }

            var index = item.IndexOf(items.Last()) + items.Last().Length;

            var final = item.Substring(index);

            if (final.Contains("\n"))
            {
                items.Add(final);
            }
            else
            {
                items[items.Count -1 ] = items[items.Count - 1] + final;
            }

            output.Add(items);
        }