C# 多文件名字符串模式的正则表达式

C# 多文件名字符串模式的正则表达式,c#,regex,pattern-matching,C#,Regex,Pattern Matching,我想解析给定模式中的某些信息,如下所示: /root/test/subfolder/ relative/folder/ index.html /root/test/style.css test/test2/test3/testN/ 我创建了一个正则表达式,但它不匹配多个字符串,比如root/,test/只匹配最后一个实例。我的代码: Regex re = new Regex(@"^(/?)([\w\.]+/)*([\w\.]+)?$"); foreach (Group gr in re.Ma

我想解析给定模式中的某些信息,如下所示:

/root/test/subfolder/
relative/folder/
index.html
/root/test/style.css
test/test2/test3/testN/
我创建了一个正则表达式,但它不匹配多个字符串,比如root/,test/只匹配最后一个实例。我的代码:

Regex re = new Regex(@"^(/?)([\w\.]+/)*([\w\.]+)?$");

foreach (Group gr in re.Match("/templates/base/test/header.html").Groups)
  Console.WriteLine(gr + " @ " + gr.Index.ToString());

Console.ReadKey();

我希望第一个斜杠是可选的,然后是结尾带有/的路径和结尾可选的文件名。

重复捕获组总是只捕获最后一个重复。但您可以捕获整个重复组(并对重复组使用非捕获括号
(?:…)

 Regex re = new Regex(@"^(/?)((?:[\w\.]+/)*)([\w\.]+)?$
这也适用于其他正则表达式风格。.NET提供了另一个功能:可以。使用正则表达式:

Match match = Regex.Match(input, @"^(/?)([\w\.]+/)*([\w\.]+)?$");
foreach (Capture capture in match.Groups[2].Captures) {
    Console.WriteLine("      Capture {0}: {1}", captureCtr, capture.Value);
    captureCtr += 1;                  
}

“我只想从上面的例子中匹配单行。我只需要中间的多个匹配,比如/模板/测试/子文件夹/Test.HTML,然后我希望它也匹配模板/测试/子文件夹/中间组。好,我在小组中发现了捕获。无论如何,谢谢:”亚力山大:啊,好吧,我误解了你的问题。现在编辑我的答案。还有一个问题,如果我有一个可选的模式(以?标记结尾)和重要的部分,我会在其中指定的字符后添加。比如(:([\w]+)?我只需要[\w]+但不需要整个组。