【发布时间】:2012-12-05 07:26:08
【问题描述】:
给定路径
C:\Users\Bob\Downloads\Product12\Prices\USD
并且只知道它包含一个名为Downloads的子目录
我有这个正则表达式来定位下载部分
(?<=Downloads\\)[^\\""]*
理想情况下,我还希望将下载之后的所有内容作为一个单独的组进行匹配,但对下载和以下路径部分使用单个正则表达式。
【问题讨论】:
给定路径
C:\Users\Bob\Downloads\Product12\Prices\USD
并且只知道它包含一个名为Downloads的子目录
我有这个正则表达式来定位下载部分
(?<=Downloads\\)[^\\""]*
理想情况下,我还希望将下载之后的所有内容作为一个单独的组进行匹配,但对下载和以下路径部分使用单个正则表达式。
【问题讨论】:
这将匹配一个子组中“下载”之前的所有内容,以及另一个子组中的所有内容:
/^(.*?Downloads\\)(.*)$/
【讨论】:
所以给定样本输入,你想得到Product12\Prices\USD,对吧?
result = Regex.Match(s, @"\\Downloads\\(.*)$").Groups[1].Value;
但是您的正则表达式中的[\\""]* 似乎表明您的路径用引号括起来,并且您不希望匹配到结束引号或它之后的任何内容。
result = Regex.Match(s, @"\\Downloads\\([^""]*)""").Groups[1].Value;
一些特别感兴趣的点是:
在 C# 中创建正则表达式时,如果可能,请始终使用 C# 的逐字字符串表示法(例如,@"regex")。它使您不必在代码中乱扔一堆反斜杠。例如,如果您的正则表达式是标准 C 样式的字符串文字,则您必须在正则表达式中使用 四个 反斜杠来匹配一个反斜杠输入。
当您在 SO 的帖子中包含正则表达式时,请按照它们出现在您的代码中的方式显示它们。这样我们就不必猜测反斜杠是什么意思了。例如,[^\\""]* 中的 \\ 是否应该与文字反斜杠匹配,或者您只是为正则表达式转义它?
说到引号," 在正则表达式中没有特殊含义,因此您不必为此转义。我将该序列更改为[^""]*,因为这就是您在逐字字符串中转义引号的方式。在 C 风格的字符串文字中,它将是 [\\"]*。
【讨论】:
你不需要 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();
【讨论】: