-1

给定路径

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

并且只知道它包含一个名为的子目录Downloads

我有这个正则表达式来定位下载部分

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

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

4

3 回答 3

0

您不需要 RegEx 来解析路径

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

将返回所有段,您可以跳过 until Downloads。例如

var paths = new Uri(@"C:\Users\Bob\Downloads\Product12\Prices\USD")
                .Segments
                .SkipWhile(s => s != "Downloads/")
                .Skip(1)
                .ToList();
于 2012-12-18T07:18:42.997 回答
0

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

/^(.*?Downloads\\)(.*)$/
于 2012-12-18T05:53:11.877 回答
0

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

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

但是[\\""]*在您的正则表达式中似乎表明您的路径用引号引起来,并且您不希望匹配到结束引号或它之后的任何内容。

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

一些特别感兴趣的点是:

  • 在 C# 中创建正则表达式时,如果可能,请始终使用 C# 的逐字字符串表示法(即@"regex")。它使您不必在代码中乱扔一堆反斜杠。例如,如果您的正则表达式是标准 C 样式的字符串文字,则您必须在正则表达式中使用四个反斜杠来匹配一个反斜杠输入。

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

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

于 2012-12-18T07:08:08.503 回答