2

だから私は前にこの質問をして、JavaScriptでそれが欲しいと言ったが、後で不必要なデータが送信されていることに気付いた。誰かがC#で同じことを解決するのを手伝ってくれたらうれしいです

必要なのは、文字列からいくつかのプロパティを取得することです。

文字列は次のようになります。

str = "car[brand=saab][wheels=4]";

プロパティの数は増減できます。

1 つの変数の最初の [] の前にすべてが必要です。

次に、変数内の各プロパティとその値が必要です。

私が何を望んでいるのかを理解する最も簡単な方法は、おそらく以前の質問とそれを解決した答えを確認することです:)

4

5 に答える 5

2

前の質問で正規表現(少し異なります)を使用しました。

string input = "car[brand=saab][wheels=4]";

string product = "";
Dictionary<string, string> props = new Dictionary<string, string>();

foreach (Match m in Regex.Matches(input, @"^(\w+)|\[(\w+)=(.+?)\]"))
{
    if (String.IsNullOrEmpty(product))
        product = m.Groups[1].Value;
    else
        props.Add(m.Groups[2].Value, m.Groups[3].Value);
}
于 2013-05-28T09:27:25.737 に答える
2

この正規表現を試してください:

(.+?)(\[.+?\])+

およびサンプルコード:

var inputString = "car[brand=saab][wheels=4]";
var pattern = @"(?<v1>.+?)(?<v2>\[.+?\])+";

var v1 = Regex.Match(inputString, pattern).Groups["v1"].Value;

Dictionary<String, String> list = new Dictionary<String, String>();
foreach (Capture capture in Regex.Match(inputString, pattern).Groups["v2"].Captures)
{
    var sp = capture.Value.Split('=');
    list.Add(sp[0], sp[1]);
}

説明:

(?<name>subexpression) 一致した部分式を名前付きグループにキャプチャします。

于 2013-05-28T09:16:26.713 に答える
1

あなたはこれを行うことができます

var lst=Regex.Matches(input,@"(\w+)((?:\[.*?\])+)")
             .Cast<Match>()
             .Select(x=>new
             {
                 name=x.Groups[1].Value,
                 value=Regex.Matches(x.Groups[2].Value,@"(?<=\[).*?(?=\])")
                            .Cast<Match>()
                            .Select(x=>new
                            {
                                 name=x.Groups[0].Value.Split('=')[0],
                                 value=x.Groups[0].Value.Split('=')[1]
                            })
             });

これで、次のように lst を反復処理できます

foreach(var parent in lst)
{
parent.name;//car
   foreach(var pairs in parent.value)
   {
        pairs.name;//brand,wheels
        pairs.value;//ferrari,4
    }
}

というわけで、入力用car[brand=a][wheels=4]cycle[brand=b][wheels=2]

出力は次のようになります

car
   brand,a
   wheels,4
cycle
   brand,b
   wheels,2
于 2013-05-28T09:45:49.740 に答える
0

正規表現を使用した回答が既にあり、コメントで正規表現を使用する必要はないと述べているため、代替案を提供します。

コードは

        string str = ("car[brand=saab][wheels=4]");
        int i = str.IndexOf("[");

        string[] details =str.Substring(i).Replace("]","").Split('[');

        string name = str.Substring(0, i);
        string brand = details[1].Split('=')[1];
        string wheels = details[2].Split('=')[1];

ただし、このアプローチは、データが常に同じ形式になることを前提としています。必要に応じて、そこにいくつかの検証が必要になる場合があります...

于 2013-05-28T09:16:27.633 に答える
0

正規表現なし:

string input = "car[brand=saab][wheels=4]";

var query = from s in input.Replace("]", "").Split('[')
            let vars = s.Split('=')
            let name = vars[0]
            let value = vars.Length > 1 ? vars[1] : ""
            select new {Name = name, Value = value};

string firstVar = query.First().Name;
Dictionary<string, string> otherVars = query
                                        .Skip(1)
                                        .ToDictionary(v => v.Name, v => v.Value);

このように辞書の変数にアクセスできますstring brand = otherVars["brand"]

于 2013-05-28T09:50:07.207 に答える