私の最終的な目標は以下の文字列をJSONに変えることですが、フィールド名とそれぞれの値を組み合わせることで一歩近づけることができます。Regexの一致/置換パターンに関する助けが必要
サンプルデータ:
Field1:abc,Field1:def,Field2:asd,Field2:fgh
それを行うことができる場合には最終的に、この結果は素晴らしいだろう:Regex.Replaceを(使用
Field1:abc;def;Field2:asd;fgh;
)、私はそれが、少なくともこのように見てする必要があります1回の呼び出しでRegex経由で。
私はこのパターンのさまざまなバリエーションを試してみたが、それは右のように見えることはできません{"Field1":"abc","Field2":"asd"},{"Field1":"def","Field2":"fgh"}
:ちょうど
(?:(\w+):)*?(?:([^:;]+);)
つだけ、他の例を私は似た何かをやっている見つけることができるが、私はそれに私の指を置くことはできません十分な違い。
Regex to repeat a capture across a CDL?
EDIT:
ここに私のソリューションです。他の人によって投稿されたものに信用を与えたいので、私は「解決策」として投稿するつもりはありません。結局のところ、私はポストされた各ソリューションから1枚を取り出し、これを思い付いた。投稿した皆様に感謝します。私は、コンパイルされ、最も速く実行され、最も正確な結果を得たソリューションに賞賛しました。
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));
LINQのパフォーマンスが正規表現に近い場合、私はゲームです。 –
大きな入力文字列を比較すると面白いです – sll
私は同意します。ここに示された同じデータは、私が変換しようとしているものと比較して非常に小さいです。実際のオブジェクトは31個のフィールドを含み、100〜200個のオブジェクトを含むことができます。 –