5

示例文本(我已突出显示所需/的 's):

对[@Key=2]/项目/项目[Person/Name='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

usingRegex.Matches可能是比尝试使用 split 更好的方法。您尝试匹配所需的输出,而不是指定要拆分的模式。这适用于基本情况:

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

正则表达式的方法是寻找一个序列:

  • 不是[, ], 或/
    or的字符
  • [something形式的序列],其中允许包含 something 。/
于 2012-05-11T18:08:45.387 回答