意外的正则表达式组

时间:2011-12-11 09:58:56

标签: c# .net regex

我想使用正则表达式来分析网址,但我不能像我期望的那样获得正则表达式组。 我的正则表达式是:

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

要匹配的字符串:

  1. “构件/过滤器一”
  2. “构件/过滤二个/选项”
  3. “构件/滤波器三/选项/选项”
  4. 我希望得到以下群组:

    1. member / filter-one,/ filter-one
    2. member / filter-two / option,/ filter-two,/ option
    3. member / filter-three / option / option,/ filter-three,/ option(with 2 capture)
    4. 我得到了第一个字符串的结果,但是我得到了另外两个字符串:

      1. member / filter-two / option,/ filter-two / option,empty string
      2. member / filter-three / option / option,/ filter-three / option / option,empty string
      3. 可能是什么问题?

2 个答案:

答案 0 :(得分:2)

尝试

@"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();

在这里,首先从字符串中删除常量部分(它可以是函数的参数)。然后,您只需检查两个/字符内的所有内容。您可以将[^/]标识为要匹配的字符,即匹配一个字符,而不是/ ,然后在其后添加标识符(+符号) ),表示匹配多个字符

答案 1 :(得分:0)

“member / filter([^ /] *)(/。+)*”似乎是合乎逻辑的,但由于它接受空选项(即member / filter1 /////////),因此不切实际。一个更准确实用的模式,也允许您接受多个带选项的过滤器成员(/ filter [^ /] +(/ [^ /] +)*)*