2011-11-02 47 views
2

我试图使用正则表达式匹配从mvc路由中获取可选参数的列表,并动态地将值注入到已使用变量的持有者中。见下面的代码。不幸的是,样本没有找到两个值,但重复了第一个值。任何人都可以提供帮助吗?使用正则表达式匹配多次使用捕获组

using System; 
using System.Text.RegularExpressions; 

namespace regexTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var inputstr = "http://localhost:12345/Controller/Action/{route:value1}/{route:value2}"; 

      var routeRegex = new Regex(@"(?<RouteVals>{route:[\w]+})"); 
      var routeMatches = routeRegex.Match(inputstr); 

      for (var i = 0; i < routeMatches.Groups.Count; i++) 
      { 
       Console.WriteLine(routeMatches.Groups[i].Value); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

此输出

{route:value1} 
{route:value1} 

我在那里hopeing得到

{route:value1} 
{route:value2} 

回答

1

我什么都不知道C#,但如果你把量词收盘parenthese后,它可以帮助,没有?

更新:That post可能会帮助你。

+0

你可以测试简化的定义:'new Regex(“({route:[\ w]})+”);'? – Renaud

+1

雷诺,你已经解决了,谢谢。您提到的帖子显示我应该使用匹配不匹配.... var routeMatches = routeRegex.Matches(inputstr); (var i = 0; i

1

只是做一个全球性的比赛:

var inputstr = "http://localhost:12345/Controller/Action/{route:value1}/{route:value2}"; 
    StringCollection resultList = new StringCollection(); 
    Regex regexObj = new Regex(@"\{route:\w+\}"); 
    Match matchResult = regexObj.Match(inputstr); 
    while (matchResult.Success) { 
     resultList.Add(matchResult.Value); 
     matchResult = matchResult.NextMatch(); 
    } 

您的结果将被保存在resultList。

0
foreach (Match match in routeMatches){ 
    for(var i=1;i<match.Groups.Count;++i) 
     Console.WriteLine(match.Groups[i].Value); 
} 
+1

嗨Bluepixy,感谢您的评论。但要注意的重要一点是,为了枚举routeMatches,您必须调用.Match()不是.Match()才可以提取所有匹配,因为Matches()返回MatchCollection,Match()只返回Match。然后,您可以按照您在此处完成的结果查询结果,也可以在我对Renaud的回复中提到的结果。 –