需要一些正则表达式匹配/替换模式的帮助

Chr*_*ler 5 c# regex

我的最终目标是将以下字符串转换为JSON,但我会通过将fieldname与每个值组合来让我更接近一些.

样本数据:

Field1:abc;def;Field2:asd;fgh;
Run Code Online (Sandbox Code Playgroud)

使用Regex.Replace(),我需要它至少看起来像这样:

Field1:abc,Field1:def,Field2:asd,Field2:fgh
Run Code Online (Sandbox Code Playgroud)

最终,如果可以通过一次调用中的Regex完成,这个结果将是非常棒的.

{"Field1":"abc","Field2":"asd"},{"Field1":"def","Field2":"fgh"}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这种模式的许多不同变体,但似乎无法做到正确:

(?:(\w+):)*?(?:([^:;]+);)
Run Code Online (Sandbox Code Playgroud)

只有一个我能找到的其他例子就是在做类似的事情,但只有足够的差异,我无法完全理解它.

正则表达式在CDL上重复捕获?

EDIT:
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案.我不会将其作为"解决方案"发布,因为我想赞扬其他人发布的内容.最后,我从每个发布的解决方案中拿出一块,然后想出了这个.感谢所有发布的人.我认为编译,执行最快并且结果最准确的解决方案.

    string hbi = "Field1:aaa;bbb;ccc;ddd;Field2:111;222;333;444;";

    Regex re = new Regex(@"(\w+):(?:([^:;]+);)+");
    MatchCollection matches = re.Matches(hbi);

    SortedDictionary<string, string> dict = new SortedDictionary<string, string>();

    for (int x = 0; x < matches.Count; x++)
    {
        Match match = matches[x];
        string property = match.Groups[1].Value;

        for (int i = 0; i < match.Groups[2].Captures.Count; i++)
        {
            string key = i.ToString() + x.ToString();
            dict.Add(key, string.Format("\"{0}\":\"{1}\"", property, match.Groups[2].Captures[i].Value));
        }
    }
    Console.WriteLine(string.Join(",", dict.Values));
Run Code Online (Sandbox Code Playgroud)

Jon*_*röm 1

我有一个想法,应该可以用更短、更清晰的方式来做到这一点。它最终并没有那么短,你可以质疑它是否更清晰。至少这是解决问题的另一种方式。

var str = "Field1:abc;def;Field2:asd;fgh";
var rows = new List<Dictionary<string, string>>();
int index = 0;
string value;
string fieldname = "";

foreach (var s in str.Split(';'))
{
    if (s.Contains(":"))
    {
        index = 0;
        var tmp = s.Split(':');
        fieldname = tmp[0];
        value = tmp[1];
    }
    else
    {
        value = s;
        index++;
    }

    if (rows.Count < (index + 1))
        rows.Insert(index, new Dictionary<string, string>());

    rows[index][fieldname] = value;
}

var arr = rows.Select(dict => 
                   String.Join("," , dict.Select(kv => 
                       String.Format("\"{0}\":\"{1}\"", kv.Key, kv.Value))))
                   .Select(r => "{" + r + "}");
var json = String.Join(",", arr );
Debug.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)

输出:

{"Field1":"abc","Field2":"asd"},{"Field1":"def","Field2":"fgh"}
Run Code Online (Sandbox Code Playgroud)