【问题标题】:Single regular expression with 2 matches具有 2 个匹配项的单个正则表达式
【发布时间】:2012-12-05 07:26:08
【问题描述】:

给定路径

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

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

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

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

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

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

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

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

    【讨论】:

    • 这似乎匹配为:第 1 组 - 下载之前的所有内容,包括第 2 组 - 下载之后的所有内容,但我刚刚意识到我的问题是错误的。我应该编辑还是创建另一个问题?
    【解决方案2】:

    所以给定样本输入,你想得到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 风格的字符串文字中,它将是 [\\"]*

    【讨论】:

      【解决方案3】:

      你不需要 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-19
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 2011-12-24
        • 2012-09-05
        相关资源
        最近更新 更多