C# Regex获取路径中的文件夹和文件名部分

C# Regex获取路径中的文件夹和文件名部分,c#,.net,regex,C#,.net,Regex,我试图将一个部分URL路径解析为3组 第1组-作业或文档 组2-文件夹路径(如果文件直接位于作业或文档下,则为空) 组3-文件名(如果只指定了文件夹路径,则为空) e、 g /Jobs/STU0001/Folder1/Sub Folder A/File Name.txt-应在所有组上匹配 /文档/文件夹2-应在组1和组2上匹配 /Docs/other File.doc-应在组1和组3上匹配 我尝试了以下方法(以及其他类似的细微变化),但无法得到一种适合所有可能输入的模式 ^/?(作业文档

我试图将一个部分URL路径解析为3组

  • 第1组-作业或文档
  • 组2-文件夹路径(如果文件直接位于作业或文档下,则为空)
  • 组3-文件名(如果只指定了文件夹路径,则为空)
e、 g

  • /Jobs/STU0001/Folder1/Sub Folder A/File Name.txt-应在所有组上匹配
  • /文档/文件夹2-应在组1和组2上匹配
  • /Docs/other File.doc-应在组1和组3上匹配
我尝试了以下方法(以及其他类似的细微变化),但无法得到一种适合所有可能输入的模式

^/?(作业文档)/(.*)/(.+\..+)$
-适用于1,而不是2或3

^/?(作业|文档)/(.*)/?(.+\..+)$
-适用于2,而不是1或3

有关信息:

  • 文件名将始终有一个扩展名(因此有一个句号/句点)
  • 文件夹名称中永远不会有句号/句号

正则表达式
\/?(作业文档)(?:\/(.+)(?=\/))?(?:\/?([^\.]+\.[a-z]+))?

输出

Match 1
Full match  0-48    `/Jobs/STU0001/Folder1/Sub Folder A/File Name.txt`
Group 1.    1-5     `Jobs`
Group 2.    6-34    `STU0001/Folder1/Sub Folder A`
Group 3.    35-48   `File Name.txt`

Match 2
Full match  49-71   `/Docs/Another File.doc`
Group 1.    50-54   `Docs`
Group 3.    55-71   `Another File.doc`

Match 3
Full match  72-86   `/Docs/Folder 2`
Group 1.    73-77   `Docs`
Group 2.    78-86   `Folder 2`
另一个:

^/(Docs|Jobs)(?:/([^.\n]*))?(?:/([^/\n]+\.[^/\n]+))?$
分崩离析:

^
行的开头

/
初始斜杠

(Docs | Jobs)
捕获第一个目录

(?:/([^.\n]*)?
匹配斜杠并捕获文件夹部分

(?:/([^/\n]+\.[^/\n]+)?
匹配斜杠并捕获文件名部分

$
字符串结尾

目录部分基本上可以包含除句点和换行之外的任何内容

文件名部分必须包含三个部分:1)文件名不包含斜杠或换行符,2)句点,以及3)扩展名不包含斜杠或换行符

两者都是可选的


.

为什么不使用标准方法
System.IO.Path.GetFileName(文件)
仅获取文件名,
System.IO.Path.GetDirectoryName(文件)
获取文件夹信息。如果你想要部分,你可以用“\”来分割后者。正则表达式是邪恶的,永远不要使用it@AlekDepler正则表达式在很多情况下都非常有用。而不是那些可以通过机载方法更快、更可靠地解决的问题