用括号外的逗号分隔值?

时间:2015-08-10 12:39:39

标签: c# .net regex split

我有以下字符串:

[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])), FUNCTION([C], [X]), 100

并希望用括号外的逗号将其拆分为:

  • [A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E]))
  • FUNCTION([C], [X])
  • 100

我无法单独执行此操作或使用此处的任何类似答案。

例如,,\s*(?!\[^()\]*\))正则表达式效果很好,但只有在没有使用嵌套括号的情况下才有效,这就是我的情况。

有人能告诉我如何分割值(使用或不使用正则表达式)?

2 个答案:

答案 0 :(得分:6)

您可以使用匹配而不是拆分:

(?:(?:\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\))|[^,])+

请参阅demo

这一部分 - \((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\) - 匹配平衡括号,而这 - [^,] - 任何字符,但逗号。

enter image description here

请参阅IDEONE demo

var line = "[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])), FUNCTION([C], [X]), 100";
var matches = Regex.Matches(line, @"(?:(?:\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\))|[^,])+");
foreach (Match m in matches)
    Console.WriteLine(m.Value.Trim());

输出:

[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E]))
FUNCTION([C], [X])
100

答案 1 :(得分:-1)

string s = "[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D], [C],[E])), FUNCTION([C], [X]), 100";
  List<string> splitted = new List<string>();
  int beginPos = 0;

  for (int i=1; i < s.Length; i++)
  {
    if (s[i] == ',' && s[i-1] == ')')// && i!=beginPos)
    {
      splitted.Add(s.Substring(beginPos, i-beginPos));
      i++;
      beginPos = i;
    }
  }

  if(beginPos < s.Length)
    splitted.Add(s.Substring(beginPos, s.Length-beginPos));