意外的正则表达式组

本文关键字:正则表达式 意外 | 更新日期: 2023-09-27 18:17:24

我想使用正则表达式来分析url,但是我无法得到我所期望的正则表达式组。正则表达式是:

@"member/filter(.*)(/.+)*"

匹配字符串:

  1. "成员/过滤大家"
  2. "会员/filter-two/选项"
  3. "会员/filter-three/选项/选项"

我希望得到以下组:

  1. 成员/过滤大家/过滤大家
  2. member/filter-two/option,/filter-two,/option
  3. member/filter-three/option/option,/filter-three,/option(with 2 capture)

我得到第一个字符串的结果,但在其他两个字符串之前,我得到:

  1. member/filter-two/option,/filter-two/option,空字符串
  2. member/filter-three/option/option,/filter-three/option/option,空字符串

有什么问题吗?

意外的正则表达式组

Try

@"member/filter([^/]*)(/.+)*"

另一种方法是这样使用MatchCollection:

string url = "member/filter-three/option/option";
url = url.Replace("member/filter-", string.Empty); // cutting static content
MatchCollection matches = new Regex(@"([^/]+)/?").Matches(url);
foreach (Match match in matches)
{
    Console.WriteLine(match.Groups[1].Value);
}
Console.ReadLine();

在这里,首先从字符串中删除常量部分(它可以是函数的参数)。然后您只需检查两个/字符内的所有内容。您可以通过将[^/]标识为您想要匹配的字符来实现这一点,这意味着匹配一个字符,而不是/ ,然后在其后面放置标识符(+号),这意味着匹配多个字符

"member/filter([^/]*)(/.+)*"似乎合乎逻辑,但不切实际,因为它接受空选项(即member/filter1/////////)。另一种更准确实用的模式是member(/filter[^/]+(/[^/]+)*)*