Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有2个匹配项的单个正则表达式_C#_.net_Regex - Fatal编程技术网

C# 具有2个匹配项的单个正则表达式

C# 具有2个匹配项的单个正则表达式,c#,.net,regex,C#,.net,Regex,给定路径 C:\Users\Bob\Downloads\Product12\Prices\USD 并且只知道它包含一个子目录,名为Downloads 我有这个正则表达式来定位下载部分 (?<=Downloads\\)[^\\""]* (?这将匹配一个子组中“下载”之前的所有内容,以及另一个子组中“下载”之后的所有内容: /^(.*?Downloads\\)(.*)$/ 因此,给定示例输入,您希望获得Product12\Prices\USD,对吗 result = Regex.Matc

给定路径

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样式的字符串文字中,它将是
    [\\”]*


    • 解析路径不需要正则表达式

      var paths = new Uri(@"C:\Users\Bob\Downloads\Product12\Prices\USD").Segments;
      
      将返回所有段,您可以跳过直到
      下载

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

      这似乎与以下内容相匹配:第一组-下载之前的所有内容,第二组-下载之后的所有内容,但我刚刚意识到我的问题是错误的。我应该编辑或创建另一个问题吗?