首页 > 解决方案 > 正则表达式根据组拆分包含括号的单词

问题描述

我有以下在一个组中考虑的术语。 Create SetDelete

对于以下输入

Create(Apple | Banana(Tree) | Mango (Tree) ) | Delete(Guava)|Set(Orange(Tree))

预期的拆分应该如下

Create(Apple | Banana(Tree) | Mango (Tree) )
Delete(Guava)
Set(Orange(Tree))

我可以想出以下没有给出正确拆分的正则表达式。

(Create|Set|Delete)\(.*\)\s*\|

标签: c#regex

解决方案


如果你使用:

\s*\|\s*(?=\b(?:Create|Set|Delete)\b)

查看在线演示


  • \s*\|\s*- 由零个或多个空格包围的文字管道符号(贪婪)。
  • (?=- 积极的前瞻:
    • \b- 字边界。
    • (?:- 打开非捕获组:
      • Create|Set|Delete- 从字面上匹配这些替代方案中的任何一个。
      • )- 关闭非捕获组。
    • \b- 字边界。
    • )- 关闭积极的前瞻。

注意:只需根据您自己的尝试添加其他“关联”和“解除关联”作为替代项。


在 C# 代码中:

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\s*\|\s*(?=\b(?:Create|Set|Delete)\b)";
      string input = "Create(Apple | Banana(Tree) | Mango (Tree) ) | Delete(Guava)|Set(Orange(Tree))";
      string[] result = Regex.Split(input, pattern, 
                                    RegexOptions.IgnoreCase,
                                    TimeSpan.FromMilliseconds(500));
      for (int ctr = 0; ctr < result.Length; ctr++) {
         Console.Write("'{0}'", result[ctr]);
         if (ctr < result.Length - 1) 
            Console.Write(", ");
      }
      Console.WriteLine();
   }
}

输出:

'Create(Apple | Banana(Tree) | Mango (Tree) )', 'Delete(Guava)', 'Set(Orange(Tree))'

在这里试试。


推荐阅读