5

私は次のような文字列を持っています

a,[1,2,3,{4,5},6],b,{c,d,[e,f],g},h

で分割した後,、5 つの項目を取得することを期待,しています。中かっこまたは角かっこ内の は無視されます。

a

[1,2,3,{4,5},6]

b

{c,d,[e,f],g}

時間

文字列に空白はありません。それを実現できる正規表現はありますか?

4

3 に答える 3

9

これを使用できます:

var input = "a,[1,2,3,{4,5}],b,{c,d,[e,f]},g";
var result =
    (from Match m in Regex.Matches(input, @"\[[^]]*]|\{[^}]*}|[^,]+")
     select m.Value)
    .ToArray();

これにより、次のような一致が見つかります。

  • [以外の任意の文字が続き]、最後に]
  • {以外の任意の文字が続き}、最後に}
  • 以外の 1 つ以上の文字,

[1,[2,3],4]これはサンプル入力では機能しますが、またはのようなネストされたグループを処理できません{1,{2,3},4}。そのためには、もう少し強力な正規表現をお勧めします。コメントで Json を解析しようとしていると述べたので、優れたJson.NETライブラリを確認することをお勧めします。

于 2013-08-05T08:38:07.567 に答える
5

正規表現は * ネストされた構造の解析には使用できません **。

( ∗非正規拡張子のない真の正規表現 )

( ∗∗ 任意の深さとインターリーブの入れ子構造)

しかし、手で解析することはそれほど難しくありません。,最初に、大括弧または中括弧で囲まれていないを見つける必要があります。

string input = "a,[1,2,3,{4,5},6],b,{c,d,[e,f],g},h";

var delimiterPositions = new List<int>();
int bracesDepth = 0;
int bracketsDepth = 0;

for (int i = 0; i < input.Length; i++)
{
    switch (input[i])
    {
        case '{':
            bracesDepth++;
            break;
        case '}':
            bracesDepth--;
            break;
        case '[':
            bracketsDepth++;
            break;
        case ']':
            bracketsDepth--;
            break;

        default:
            if (bracesDepth == 0 && bracketsDepth == 0 && input[i] == ',')
            {
                delimiterPositions.Add(i);
            }
            break;
    }
}

そして、これらの位置で文字列を分割します。

public List<string> SplitAtPositions(string input, List<int> delimiterPositions)
{
    var output = new List<string>();

    for (int i = 0; i < delimiterPositions.Count; i++)
    {
        int index = i == 0 ? 0 : delimiterPositions[i - 1] + 1;
        int length = delimiterPositions[i] - index;
        string s = input.Substring(index, length);
        output.Add(s);
    }

    string lastString = input.Substring(delimiterPositions.Last() + 1);
    output.Add(lastString);

    return output;
}
于 2013-08-05T11:36:34.627 に答える