使用正则表达式匹配多次使用捕获组
问题描述:
我试图使用正则表达式匹配从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}
答
只是做一个全球性的比赛:
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。
答
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的回复中提到的结果。 –
你可以测试简化的定义:'new Regex(“({route:[\ w]})+”);'? – Renaud
雷诺,你已经解决了,谢谢。您提到的帖子显示我应该使用匹配不匹配.... var routeMatches = routeRegex.Matches(inputstr); (var i = 0; i