单个正则表达式,有2个匹配

时间:2012-12-18 05:49:36

标签: c# .net regex

给出路​​径

C:\Users\Bob\Downloads\Product12\Prices\USD

并且只知道它包含一个名为Downloads

的子目录

我有这个正则表达式来找到下载部分

(?<=Downloads\\)[^\\""]*

理想情况下,我还希望将“下载”之后的所有内容与单独的组匹配,但是对于“下载”和以下路径部分使用单个正则表达式。

3 个答案:

答案 0 :(得分:0)

这将匹配一个子组中“下载”之前的所有内容,以及另一个子组中的所有内容:

/^(.*?Downloads\\)(.*)$/

答案 1 :(得分:0)

所以给定样本输入,你想获得Product12\Prices\USD,对吧?

result = Regex.Match(s, @"\\Downloads\\(.*)$").Groups[1].Value;

但是你的正则表达式中的[\\""]*似乎表明你的路径用引号括起来,你不希望匹配结束引号或其后的任何内容。

result = Regex.Match(s, @"\\Downloads\\([^""]*)""").Groups[1].Value;

特别感兴趣的一点是:

  • 在C#中创建正则表达式时,如果可能的话,总是使用C#的逐字字符串表示法(即@"regex")。它可以节省您使用一堆反斜杠丢弃代码的麻烦。例如,如果你的正则表达式是标准的C风格的字符串文字,你必须在正则表达式中使用四个反斜杠来匹配一个反斜杠输入。

  • 当您在此处的帖子中包含正则表达式时,请在代码中显示它们。然后我们不必猜测反斜杠是什么意思。例如,\\中的[^\\""]*应该与文字反斜杠匹配,还是只是为正则表达式转义它?

  • 说到引号,"在正则表达式中没有特殊含义,所以你不必为此而逃避它。我将该序列更改为[^""]*,因为这是您在逐字字符串中转义引号的方式。在C风格的字符串文字中,它将是[\\"]*

答案 2 :(得分:0)

您不需要RegEx来解析路径

var paths = new Uri(@"C:\Users\Bob\Downloads\Product12\Prices\USD").Segments;

会返回所有细分,您可以跳到Downloads。例如

var paths = new Uri(@"C:\Users\Bob\Downloads\Product12\Prices\USD")
                .Segments
                .SkipWhile(s => s != "Downloads/")
                .Skip(1)
                .ToList();