拆分字符串,但忽略括号或大括号中的分隔符

时间:2013-08-05 08:34:04

标签: c# regex

我有一个像

这样的字符串
  

一个,[1,2,3,{4,5},6],B,{C,d,[E,F],克},H

,拆分后,我希望得到5个项目,大括号或括号中的,会被忽略。

  

     

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

     

B'/ P>      

{C,d,[E,F],克}

     

ħ

字符串中没有空格。是否有正则表达式可以实现它?

3 个答案:

答案 0 :(得分: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,[2,3],4]{1,{2,3},4}等嵌套组。为此,我建议一些更强大的正则表达式。既然您在评论中提到过您正在尝试解析Json,我建议您查看优秀的Json.NET库。

答案 1 :(得分:4)

正则表达式*不能用于解析嵌套结构**。

(* True 常规表达式,不含非regular扩展名)

(**任意深度和交错的嵌套结构)

但手工解析并不困难。首先,您需要找到不在括号或大括号中的,

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;
}

答案 2 :(得分:1)

即使它看起来很丑陋并且没有涉及正则表达式(不确定它是否是原始问题中的要求或很好的),这个替代方案应该有效:

class Program
{
    static void Main(string[] args)
    {
        var input = "a,[1,2,3,{4,5}],b,{c,d,[e,f]},g";
        var output = "<root><n>" +
            input.Replace(",", "</n><n>")
            .Replace("[", "<n1><n>")
            .Replace("]", "</n></n1>")
            .Replace("{", "<n2><n>")
            .Replace("}", "</n></n2>") +
            "</n></root>";
        var elements = XDocument
            .Parse(output, LoadOptions.None)
            .Root.Elements()
            .Select(e =>
            {
                if (!e.HasElements)
                    return e.Value;
                else
                {
                    return e.ToString()
                        .Replace(" ", "")
                        .Replace("\r\n", "")
                        .Replace("</n><n>", ",")
                        .Replace("<n1>", "[")
                        .Replace("</n1>", "]")
                        .Replace("<n2>", "{")
                        .Replace("</n2>", "}")
                        .Replace("<n>", "")
                        .Replace("</n>", "")
                        .Replace("\r\n", "")
                        ;
                }
            }).ToList();
    }
}