分割非定界且可变长度的字符串

时间:2018-10-08 15:32:32

标签: c# parsing

给出以下字符串

38051211)JLRx(0x04>0x01):JL_PAGE_INFO(0x63,0x00,0x01,0x03,0x00,0x73,0x00,0x00,0x0A,0x01,0x01,0xF2,0x01)

如何拆分它,以便可以在列表视图列中使用每个拆分?

例如,我可以在:处使用split,但是接下来我需要在下一个处进行拆分(拆分后的每个值都使用,。

任何建议将不胜感激,它是我如何添加第二和第三等类似内容的我

 {
    if (line.Contains("JLTx"))
    {
        string[] JLTx = line.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
        listView1.Items.Add(JLTx[0]);
        listView1.Items[listView1.Items.Count - 1].SubItems.Add(JLTx[1]);                       
    }
}

因此,使用以下正则表达式

Regex regex = new Regex(@"(.*)JLTx\((.*)\):(JL_[(A-Z)_]*)\((.*)\)");

我似乎无法在:分裂,因为没有任何一场比赛。我要去哪里错了

谢谢

2 个答案:

答案 0 :(得分:0)

如果拆分字符串的第二项-JLTx [1]-始终为JL_PAGE_INFO(...),我将尝试这样做:

string[] mystring = JLTx[1].Replace("JL_PAGE_INFO(","").Replace(")","")Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

答案 1 :(得分:0)

正如其他人指出的那样,您可以使用很多选项将其解析为某些标头友好格式。如果您的JL_PAGE_INFO对于所有输入都是稳定的,则上述@Johns答案将起作用。您也可以使用正则表达式。这在很大程度上取决于输入数据的稳定性。这是一个使用字符串函数创建您描述的标头列表的示例。

    static IEnumerable<string> Tokenize(string input)
    {
        if (string.IsNullOrEmpty(input))
            yield break;
        if (')' != input[input.Length - 1])
            yield break;

        int colon = input.IndexOf(':');

        string pageData = input.Substring(colon + 1);

        if (string.IsNullOrEmpty(pageData))
            yield break;

        int open = pageData.IndexOf('(');

        if (colon != -1 && open != -1)
        {
            yield return input.Substring(0, colon+1);

            foreach (var token in pageData.Substring(open+1, pageData.Length - (open + 1) - 1).Split(','))
                yield return token;
        }
    }