/ /角カッコ内を除いてスラッシュを得る - c#、regex

大括弧の中を除いてスラッシュを得る - c#、regex

テキストの例(私は、 /"s):

ペア[@ Key = 2]/アイテム/アイテム[Person / Name = "Martin"]/日付

私は正方形の括弧の中にないそれぞれの前方スラッシュを取得しようとしています、誰もこれで私を助けることができる正規表現で滑りやすい?使用方法は次のとおりです。

string[] result = Regex.Split(text, pattern);

私はこのコードでそれをやったが、同じことをするより単純なRegexがあるかどうか疑問に思っていた:

private string[] Split()
{
List<string> list = new List<string>();
int pos = 0, i = 0;
bool within = false;
Func<string> add = () => Format.Substring(pos, i - pos);
//string a;
for (; i < Format.Length; i++)
{
//a = add();
char c = Format[i];
switch (c)
{
case "/":
if (!within)
{
list.Add(add());
pos = i + 1;
}
break;
case "[":
within = true;
break;
case "]":
within = false;
break;
}
}
list.Add(add());
return list.Where(s => !string.IsNullOrEmpty(s)).ToArray();
}

回答:

回答№1は2

を使用して Regex.Matches スプリットを使用しようとするよりも良いアプローチかもしれません。分割するパターンを指定する代わりに、目的の出力を照合します。これは基本的な場合に有効です:

string[] FancySplit(string input) {
return Regex.Matches(input, @"([^/[]]|[[^]]*])+")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
}

正規表現のアプローチは、次のシーケンスを探すことです。

  • ない文字 [, ]、または /
    または
  • フォームのシーケンス [ 何か ]何かが含まれている場所 /

回答№2については2

これは一般的なケースでは機能しませんが、ほとんどの実用的なケースが正しいでしょう:

(?<![[^]]+)/

この式では、 負帰還 前方スラッシュにマッチするには、スラッシュの前に大括弧が続き、最後に角括弧以外の文字列が続く場合を除きます。