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