0

これは私の現在の文字列がどのように見えるかです:

Data={Person, Id, Destination={Country, Price}}

こんな風にも見えるかも

Data={Person, Id, Specification={Id, Destination={Country, Price}}}

私が必要としているのは、文字列全体を検索して取得できる方法です。

を検索し、最初と最後の括弧の間のDataデータ全体を取得します Data={**GET THIS**}

次に、取得したデータを使用して、次を取得できるはずです。

PersonId、その後、Specificationデータと同じことを行うことがわかった場合は、最後のブラケットまで内部の内容を取得し、同じことを行いDestinationます。

どうすればいいですか?これにはC#を使用しています。

4

2 に答える 2

1

中括弧の間のすべてを取得する関数:

public string retrieve(string input)
{
    var pattern = @"\{.*\}";
    var regex = new Regex(pattern);
    var match = regex.Match(input);
    var content = string.Empty;
    if (match.Success)
    {
        // remove start and end curly brace
        content = match.Value.Substring(1, match.Value.Length - 2);
    }
    return content;
}

次に、関数を使用してコンテンツを取得します。

var input = @"Data={Person, Id, Specification={Id, Destination={Country, Price}}}";
var content = retrieve(input);
Console.Out.WriteLine(content);
if (!string.IsNullOrEmpty(content))
{
    var subcontent = retrieve(content);
    Console.Out.WriteLine(subcontent);
    // and so on...
}

出力は次のとおりです。

Person, Id, Specification={Id, Destination={Country, Price}}
Id, Destination={Country, Price}

string.Split(',')を使用してPersonIdを取得することはできません。これは、括弧の間で文字列を分割することにもなり、これを望まないためです。代わりに、推奨されるstring.IndexOfを正しい位置から 2 回使用すると、部分文字列が正しく表示されます。

// TODO error handling
public Dictionary<string, string> getValues(string input)
{
    // take everything until =, so string.Split(',') can be used
    var line = input.Substring(0, input.IndexOf('='));
    var tokens = line.Split(',');
    return new Dictionary<string, string> { { "Person" , tokens[0].Trim() }, { "Id", tokens[1].Trim() } };
}

この関数は、取得したコンテンツに対して使用する必要があります。

var input = @"Data={Person, Id, Specification={Id, Destination={Country, Price}}}";
var content = retrieve(input);
var tokens = getValues(content);
Console.Out.WriteLine(string.Format("{0} // {1} // {2}", content, tokens["Person"], tokens["Id"]));
if (!string.IsNullOrEmpty(content))
{
    var subcontent = retrieve(content);
    Console.Out.WriteLine(subcontent);
    var subtokens = getValues(subcontent);
    Console.Out.WriteLine(string.Format("{0} // {1} // {2}", subcontent, subtokens["Person"], subtokens["Id"]));
}

出力は次のとおりです。

Person, Id, Specification={Id, Destination={Country, Price}} // Person // Id
Id, Destination={Country, Price}
Id, Destination={Country, Price} // Id // Destination
于 2013-10-12T08:30:45.653 に答える
0

あなたはこのようなことを試すことができます -

string str = "Data={Person, Id, Specification={Id, Destination={Country, Price}}}";
string[] arr = str.Split(new char[]{'{','}','=',','},StringSplitOptions.RemoveEmptyEntries).Where(x => x.Trim().Length != 0).Select(x => x.Trim()).ToArray();
foreach(string s in arr)
    Console.WriteLine(s);

Where(x => x.Trim().Length != 0)part は、スペースのみを含む文字列を削除するために使用されます。

Select(x => x.Trim())part は、すべての部分文字列の先頭と末尾のスペースを削除するために使用されます。

結果は

Data
Person
Id
Specification
Id
Destination
Country
Price

これで、配列を反復処理してデータを解析できるようになりました。基本的なロジックは

if(arr[i] == "Data") の場合、次の 2 つの項目は person と id になります

if(arr[i] == "Destination") の場合、次の 2 つの項目は ID と宛先になります

if(arr[i] == "specification") の場合、次の 2 つの項目は国と価格になります

于 2013-10-12T17:43:10.990 に答える