c#获得第一个&#39 ;;'括号后

时间:2017-01-31 10:34:46

标签: c# split substring

问我最愚蠢的问题,我感到愚蠢。

我正在帮助某人获得他希望的自定义​​编译器的结果,该编译器在一个字符串中读取xml文件的所有行,因此它将如下所示,并且因为他希望它能够支持"支持"在数组中调用变量最坏的情况如下所示:

"Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];"

我需要的是找到第一个&#34 ;;"在" ["和"]"拆分它,所以我坚持这个:

"Var1 = [5,4,3,2];

它还必须支持多个" [","]"例如:

"Var2 = [5,Var1,[4],2];"

编辑:最后一个"]"之间可能还有数据。和";" 例如:

"Var2 = [5,[4],2]Var1;

我能在这做什么?我有点卡住了。

3 个答案:

答案 0 :(得分:3)

您可以尝试正则表达式,例如

  string source = "Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];";

  // 1. final (or the only) chunk doesn't necessary contain '];':
  //   "abc" -> "abc"
  // 2. chunk has at least one symbol except '];'  
  string pattern = ".+?(][a-zA-Z0-9]*;|$)";

  var items = Regex
    .Matches(source, pattern) 
    .OfType<Match>()
    .Select(match => match.Value)
    .ToArray();

  Console.Write(string.Join(Environment.NewLine, items));

结果:

  Var1 = [5,4,3,2]abc123;
   Var2 = [2,8,6,Var1;4];

答案 1 :(得分:1)

^([^;]+);

这个正则表达式适用于所有人。 您可以像这样使用它:

    string[] lines = 
            {
                "Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];",
                "Var2 = [5,[4],2]Var1; Var2 = [2,8,6,Var1;4];"
            };

        Regex pattern = new Regex(@"^([^;]+);");

        foreach (string s in lines){
            Match match = pattern.Match(s);
            if (match.Success)
            {
                Console.WriteLine(match.Value);
            }
        }

解释是:

  

^表示开始于和[^;]除了分号之外的任何内容   +表示重复一次或多次并且是;然后是分号

这会找到Var1 = [5,4,3,2];以及Var1 = [5,4,3,2];

您可以看到输出HERE

答案 2 :(得分:0)

public static string Extract(string str, char splitOn)
{
    var split = false;
    var count = 0;
    var bracketCount = 0;

    foreach (char c in str)
    {
        count++;
        if (split && c == splitOn)
           return str.SubString(0, count);

        if (c == '[')
        {
             bracketCount++;
             split = false;
        }
        else if (c == ']')
        {
             bracketCount--;

             if (bracketCount == 0)
             { 
                 split = true;
             }
             else if (bracketCount < 0)
                 throw new FormatException(); //?
        }
    }

    return str;
}