私は次のような文字列を持っています
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}
時間
文字列に空白はありません。それを実現できる正規表現はありますか?
これを使用できます:
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,[2,3],4]
これはサンプル入力では機能しますが、またはのようなネストされたグループを処理できません{1,{2,3},4}
。そのためには、もう少し強力な正規表現をお勧めします。コメントで Json を解析しようとしていると述べたので、優れたJson.NETライブラリを確認することをお勧めします。
正規表現は * ネストされた構造の解析には使用できません **。
( ∗非正規拡張子のない真の正規表現 )
( ∗∗ 任意の深さとインターリーブの入れ子構造)
しかし、手で解析することはそれほど難しくありません。,
最初に、大括弧または中括弧で囲まれていないを見つける必要があります。
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;
}