【问题标题】:Regex.Split help in C#C# 中的 Regex.Split 帮助
【发布时间】:2011-05-19 09:28:28
【问题描述】:

我有这个字符串:

A,B,C[D,E,F[G,H,J[I]],K,L[M,N] 

而使用 Regex.Split() 我需要这样划分的结果:

A,B
C[D,E]
F[G,H]
J[I]
K
L[M,N]

【问题讨论】:

  • 如果没有正则表达式,这会更容易。正则表达式不能很好地处理递归结构。另外,这是一种非常奇怪的输出格式……这到底是为了什么?
  • 你确定括号不平衡?

标签: c# regex split


【解决方案1】:

我不确定你是否可以纯粹使用正则表达式来做到这一点(如果可能的话,我怀疑所需的正则表达式会非常复杂)。

这是一种替代方法,尽管最好完全跳过正则表达式并手动解析所有内容:

string yourString = "A,B,C[D,E,F[G,H,J[I]],K,L[M,N]";

var parts = Regex.Split(yourString, @",(?=[^,\[]+\[)|\]+,?")
                 .Where(s => s.Length > 0)
                 .Select(s => s.Contains("[") ? s + "]" : s);

【讨论】:

  • 感谢您的帮助但我只使用字母来帮助理解我的问题,因为真正的字符串例如是:Identifier, Block[Identifier,Content[Identifier,price,destination]], Description , 关键词
  • @expertCode:好的,我已经进行了编辑以适应这一点。不过,最好首先提及该要求。
  • 对不起另一个问题,但我在复杂字符串中发现了其他问题:Description,title,ContentFooterLeft[JE_Boxes.Identifier,JE_Boxes.Box*,JE_Boxes.Namespace,JE_Boxes.Title*,JE_Boxes.Channels, JE_ Boxes.PriorityChannels,JE_Boxes.ForceChannel,JE_Boxes.SingleQuery,JE_Boxes.Template,JE_Boxes.Elements[JE_Example.Lead],JE_Boxe s.LastNews[JE_Article.Lead,JE_Article.Galeria [JE_Gallery.Title,JE_Gallery.Banner [JE_Banner.Title] ],],],],关键字
  • @expertCode:您可以编辑您的问题以包含额外的详细信息吗?即,输入字符串的外观和您的预期结果。
【解决方案2】:

试试这个:

Regex re = new Regex(@"((?:\w+)\[(?:(?:\w+\b,?)(?!\[))+)");

var result = re.Split(str.Replace(" ", ""))
               .Select(s => s.TrimEnd(',', '[').TrimStart(']', ','))
               .Where(s => !string.IsNullOrEmpty(s));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多