1

自分で問題を解決するために似たようなものを見つけようとしましたが、いくつかの「部品」しか見つけられず、それらを組み合わせる方法がわかりません。だから、誰かが私を助けてくれることを願っています。問題:

1 つ (または複数) のネストされた配列を持つ配列を含む文字列があります。

[1,'ab c',[1,'ab c',"AB C"],"AB C"]

または多分

[1,['ab c'],'a',[1,"AB C"],"AB C"]

等...

私が結果に入れたいのは、コンマで分割された一番上の配列ですが、コンマを含むネストされた配列がありますが、ブラケットはありません。

例えば。最初の文字列の場合:

[0] -> 1

[1] -> 'abc'

[2] -> 1,'ab c',"AB C"

[3] -> 「AB C」

分割されたトップ配列を提供する現在の正規表現は次のとおりです。

/\[[\w\d\s\,\'\"]+]|[\w\d\s\"\']+/g

しかし、正規表現を変更して内側の括弧を「カット」する方法がわかりません...先読み/後読み、単語境界、グループなどを使用して、すでにさまざまな方法を試しましたが、成功しませんでした。それで、それは可能ですか?はいの場合、どのように?

間違ったアプローチを選択したのかもしれませんが、正規表現は初めてだと言わざるを得ません。したがって、前者が正しくない場合は、ご容赦ください。

助けてくれてありがとう!

マルコ

4

2 に答える 2

0

試す

String[] parts = string.substring(1,string.length()-1).split(",");
for (int n = 0; n < parts.length; n++) {
    if (parts.charAt(0) == '[') parts[n] = parts[n].substring(1,parts[n].length()-1);
}

それは文字通りあなたが言ったことをします

一番上の配列はコンマで分割されていますが、入れ子になった配列は括弧なしです。

時々、プログラミングはとても簡単です:)

于 2012-11-28T09:10:02.920 に答える
0

この分割正規表現はかなり醜いですが、あなたが望むことをします。RegexBuddy を使用してわかることから、それは .NET でのみ機能します。

(?<=^\[(?:(?>\[[^\]\[]+(?:\]|(?=\])))|(?>[^\[\]]+))*|^)[,\[\]]+

私は正規表現を使用するのが好きですが、この場合は次のような小さな関数 (C# で記述) を使用すると思います。

string[] DeserializeArray(string serializedArray) {
    const char OPEN_GROUP = '[', CLOSE_GROUP = ']', DELIMITER = ',';
    List<string> deserializedArray = new List<string>();
    StringBuilder accumulator = new StringBuilder();
    int nestDepth = 0;
    int baseDepth = serializedArray[0] == OPEN_GROUP ? 1 : 0;
    for(int i=0; i<serializedArray.Length; ++i){
        if(serializedArray[i] == OPEN_GROUP) ++nestDepth;
        else if(serializedArray[i] == CLOSE_GROUP) --nestDepth;
        else if(serializedArray[i] == DELIMITER && nestDepth <= baseDepth) {
            deserializedArray.Add(accumulator.ToString());
            accumulator.Clear();
        }
        else {
            accumulator.Append(serializedArray[i]);
        }
    }
    deserializedArray.Add(accumulator.ToString());
    return deserializedArray.ToArray();
}
于 2012-12-02T13:43:32.873 に答える