Skip to main content
 首页 » 编程设计

c#之带有可选匹配组的正则表达式

2024年05月06日38webabcd

我正在尝试解析给定的字符串,它是一种用 / 分隔的路径。我需要编写正则表达式来匹配路径中的每个段到相应的正则表达式组。

示例 1:

输入:

/EAN/SomeBrand/appliances/refrigerators/RF444

输出:

组:生产者,值:SomeBrand 组:类别,值:电器 组:子类别,值:冰箱 组:产品,值:RF4441

示例 2:

输入:

/EAN/SomeBrand/appliances

输出:

组:生产者,值:SomeBrand 组:类别,值:电器 组:子类别,值: 组:产品,值:

我尝试了以下代码,当路径已满(如第一个示例)时它工作正常,但当输入字符串是独立的时无法找到组(如示例 2)。

static void Main() 
{ 
  var pattern = @"^" + @"/EAN" 
                + @"/" + @"(?<producer>.+)" 
                + @"/" + @"(?<category>.+)" 
                + @"/" + @"(?<subcategory>.+)" 
                + @"/" + @"(?<product>.+)?" 
                + @"$"; 
 
  var rgx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
  var result = rgx.Match(@"/EAN/SomeBrand/appliances/refrigerators/RF444"); 
 
  foreach (string groupName in rgx.GetGroupNames()) 
  { 
    Console.WriteLine( 
       "Group: {0}, Value: {1}", 
       groupName, 
       result.Groups[groupName].Value); 
  } 
 
 
  Console.ReadLine(); 
} 

欢迎任何建议。不幸的是,我不能简单地拆分字符串,因为我使用的框架需要 regex 对象。

请您参考如下方法:

您可以使用可选组 (...)? 并将 .+ 贪心点匹配模式替换为否定字符类 [^/]+:

^/EAN/(?<producer>[^/]+)/(?<category>[^/]+)(/(?<subcategory>[^/]+))?(/(?<product>[^/]+))?$ 
                                           ^                      ^^^                  ^^ 

参见 regex demo

这是您需要在 C# 代码中声明正则表达式的方式:

var pattern = @"^" + @"/EAN" 
            + @"/(?<producer>[^/]+)" 
            + @"/(?<category>[^/]+)" 
            + @"(/(?<subcategory>[^/]+))?" 
            + @"(/(?<product>[^/]+))?" 
            + @"$"; 
 
var rgx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); 

请注意,我将常规捕获组用作可选组,但是 RegexOptions.ExplicitCapture 标志将所有未命名的捕获组变为非捕获,因此,它们确实如此不会出现在 Match.Groups 中。因此,即使不使用非捕获可选组 (?:...)?,我们始终只有 5 个组。