C# 使用正则表达式提取没有文件名的路径?

C# 使用正则表达式提取没有文件名的路径?,c#,.net,regex,C#,.net,Regex,我完全掌握了下面的线索。使用正则表达式如何仅提取路径 "C:\Python34\py.exe" "%1" %* 我已经尝试过这些模式,但没有成功: ([a-zA-Z]:[\[a-zA-Z0-9.]]*) 它给出了整个路径C:\Python34\py.exe ^[^\t]+[\t]+(.*)$ 它给出了整个字符串“C:\Python34\py.exe”“%1”%* 编辑 我知道System.IO名称空间中的选项。但是出现了一个字符串,我需要从中提取路径->“C:\Python34\py.exe”

我完全掌握了下面的线索。使用正则表达式如何仅提取路径

"C:\Python34\py.exe" "%1" %*
我已经尝试过这些模式,但没有成功:

([a-zA-Z]:[\[a-zA-Z0-9.]]*)

它给出了整个路径
C:\Python34\py.exe

^[^\t]+[\t]+(.*)$

它给出了整个字符串
“C:\Python34\py.exe”“%1”%*

编辑

我知道System.IO名称空间中的选项。但是出现了一个字符串,我需要从中提取路径->
“C:\Python34\py.exe”“%1”“%*

如我所示,包含路径的字符串可能不规则

应该使用类中可用的静态方法,而不是使用正则表达式

如果希望路径不包含文件名,可以执行以下操作:

string myFullPath = @"C:\Python34\py.exe";
string pathOnly = Path.GetDirectoryName(myFullPath);
//pathOnly will be "C:\Python34"
编辑:由于路径后将有参数,因此我们可以首先获得第一个引用的子字符串:

Regex quotedPattern = new Regex("([\"'])(?:(?=(\\?))\2.)*?\1");
Match matches = quotedPattern.Match(myFullPath);
if(matches.Groups.Count > 0)
{
     pathOnly = matches.Captures[0].Value;
     pathOnly = Path.GetDirectoryName(pathOnly);
}

正则表达式测试:

在您的情况下,直接对输入使用
Path.GetDirectoryName
,抛出异常。您可以结合使用
Split
Trim
GetDirectoryName
尝试这种非正则方法:

string value = "\"C:\\Python34\\py.exe\" \"%1\" %*";

var result = System.IO.Path.GetDirectoryName(value.Split(' ').First().Trim('\"'));
//result: C:\Python34

另一个选项是使用
Path.GetDirectoryName
和一个简单的
子字符串

string value = "\"C:\\Python34\\py.exe\" \"%1\" %*";
string path = Path.GetDirectoryName(value.Substring(1, value.IndexOf("\"", 2)-1));

我想你可以对它进行概括,找到足以区分它的
从其他引用的值

这需要在引用的字符串中至少有一个
\
file.ext

 "
 # @"""([^""]*)\\([^""\\]+(?:\.[^"".\\]+))"""

 (                    # (1 start), Path
      [^"]* 
 )                    # (1 end)
 \\ 
 (                    # (2 start), File name
      [^"\\]+ 
      (?:
           \.
           [^".\\]+ 
      )
 )                    # (2 end)
 "
输出:

 **  Grp 0 -  ( pos 0 , len 22 ) 
"C:\Python34\py.exe.d"  
 **  Grp 1 -  ( pos 1 , len 11 ) 
C:\Python34  
 **  Grp 2 -  ( pos 13 , len 8 ) 
py.exe.d  

我知道这个选择。但是有一个字符串即将出现,我需要从中提取路径->“C:\Python34\py.exe”“%1”“%*那么为什么不在空白处拆分呢?然后将路径与参数分开。因为我不能保证它始终是一个规则字符串,如我所示。@Gandarez可能出现的不规则情况是什么?@JNYRanger:如果路径本身包含空格,则拆分空格可能会出错。特别是,完整调用字符串中的引号应该覆盖空格分隔。目录是否总是像示例中那样使用引号?(“”)OP…先提取引用的路径怎么样?我已经更新了我的答案,如果有可能的话。到目前为止,答案更好!tks