5

テキストの例 (目的の 's を強調表示しました/):

ペア[@キー=2]/項目/項目[人/名前='Martin']/日付

角括弧内にない各スラッシュを取得しようとしていますが、これについて私を助けることができる正規表現で滑らかな人はいますか? 用途は次のとおりです。

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

私はこのコードでそれを行いましたが、同じことを行うより単純な正規表現があるかどうか疑問に思っていました:

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();
}
4

2 に答える 2

2

これは一般的なケースでは機能しませんが、ほとんどの実際的なケースでは正しく機能します。

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

この式の前に角括弧があり、その後に角括弧以外の文字のシーケンスが続く場合を除き、この式は負の後読みを使用してスラッシュを一致させます。

于 2012-05-11T18:02:39.893 に答える
2

を使用Regex.Matchesする方が、分割を使用するよりも優れたアプローチである可能性があります。分割するパターンを指定する代わりに、目的の出力に一致させようとします。これは基本的なケースで機能します:

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

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

  • []、または/
    または以外の文字
  • [何か]を含むことができる形式のシーケンス/
于 2012-05-11T18:08:45.387 に答える