2

この基本形式を持つ一連の文字列がある場合:

"[id value]"//id and value are space delimited.  id will never have spaces

次に、次のようにネストできます。

[a]
[a [b value]]
[a [b [c [value]]]

したがって、すべての項目に 0 または 1 の値エントリを含めることができます。

この形式を解析するための最良の方法は何ですか? string.Split() や string.IndexOf() のようなものを使用するだけですか、それとももっと良い方法がありますか?

4

4 に答える 4

2

split メソッドと indexof メソッドに問題はありません。これらは文字列の解析のために存在します。あなたの場合のサンプルは次のとおりです。

        string str = "[a [b [c [d value]]]]";

        while (str.Trim().Length > 0)
        {
            int start = str.LastIndexOf('[');
            int end = str.IndexOf(']');

            string s = str.Substring(start +1, end - (start+1)).Trim();
            string[] pair = s.Split(' ');// this is what you are looking for. its length will be 2 if it has a value

            str = str.Remove(start, (end + 1)- start);
        }
于 2010-10-12T08:39:13.127 に答える
2

少しの再帰と分割が機能します。主なポイントは再帰を使用することです。これにより、非常に簡単になります。あなたの入力構文はLISPのようなものです:)

Parsing a, split, no second part. done.
Parsing a [b value]. has second part, go to the beginning.
...

あなたはアイデアを得る。

于 2010-10-12T07:33:06.360 に答える
1

正規表現は常に優れたソリューションです。

string test = "[a [b [c [value]]]";
Regex r = new Regex("\\[(?<id>[A-Za-z]*) (?<value>.*)\\]");
var res = r.Match(test);

次に、値 (最初の反復後の [b [c [値]]) を取得し、一致が失敗するまで同じ値を再度適用できます。

string id = res.Groups[1].Value;
string value = res.Groups[2].Value;
于 2010-10-12T07:38:02.247 に答える
0

単純な分割が機能する必要がありますすべてのidに対して、1 つのブラケットがあります[
したがって、その文字列を分割すると、n-ブラケットがあるため、最後の要素に値が含まれるn-1 id(s) になります。

于 2010-10-12T07:35:20.363 に答える