【问题标题】:Splitting values by commas that are outside parentheses?用括号外的逗号分隔值?
【发布时间】:2015-08-10 12:39:39
【问题描述】:

我有以下字符串:

[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*(?!\[^()\]*\)) 正则表达式效果很好,但前提是不使用嵌套括号,这是我的情况。

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

【问题讨论】:

  • 您必须使用 push/pop 方法或递归方法来解析术语。这看起来像一个学校作业。这不是一个简单的问题,需要几个小时才能得到完整的解决方案。
  • @juharr 正如我所说 - 这个答案不适用于嵌套括号。
  • @gotqn 有几个答案考虑了嵌套括号,例如 fubo。它们不是正则表达式答案,但您说您可以使用不使用正则表达式的解决方案。

标签: c# .net regex split


【解决方案1】:

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

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

demo

这部分 - \((?&gt;[^()]+|\((?&lt;number&gt;)|\)(?&lt;-number&gt;))*(?(number)(?!))\) - 匹配平衡括号,而这 - [^,] - 任何字符,但逗号除外。

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

【讨论】:

  • 您可以阅读有关它们的信息hereherehere。这不是微不足道的,但它相当直截了当,虽然看起来很乱:(没有那部分的正则表达式非常简单:只需匹配平衡的括号,或者任何不是逗号的东西。
  • 此解决方案是否仅适用于一定级别的嵌套括号,并且肯定会因不同级别的嵌套而中断?乍一看似乎是这样。
  • @klaar:层数可以很多,只受可用栈深度的限制。
  • 我应该替换哪些括号以在大括号之外搜索命令?
  • @dandan 你要@"(?:(?:\{(?&gt;[^{}]+|{(?&lt;n&gt;)|}(?&lt;-n&gt;))*(?(n)(?!))})|[^,])+",见C# demo
【解决方案2】:
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));

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 2017-06-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多