使用regex提取没有文件名的路径

本文关键字:文件名 路径 regex 提取 使用 | 更新日期: 2023-09-27 17:53:55

我正好有下面的字符串。使用正则表达式我如何提取只有路径?

"C:'Python34'py.exe" "%1" %*

我已经尝试了这些模式,但没有成功:

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

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

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

它给出了整个字符串"C:'Python34'py.exe" "%1" %*

编辑

我知道系统的选项。IO命名空间。但是有一个字符串来了,我需要从中提取路径-> "C:'Python34'py.exe" "%1" %*如我所示,包含路径的字符串可能不是规则的。

使用regex提取没有文件名的路径

您应该使用System.IO.Path类中可用的静态方法而不是使用Regex。

如果你想要不带文件名的路径,你可以这样做:

string myFullPath = @"C:'Python34'py.exe";
string pathOnly = Path.GetDirectoryName(myFullPath);
//pathOnly will be "C:'Python34"

EDIT:因为你要在路径后面有参数,我们可以先得到第一个引号括起来的子字符串:

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);
}

RegexStorm

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

string value = "'"C:''Python34''py.exe'" '"%1'" %*";
var result = System.IO.Path.GetDirectoryName(value.Split(' ').First().Trim(''"'));
//result: C:'Python34

我猜你可以把它概括一下,找到足够的东西来区分它
从其他引用值。

这要求在引号中至少有一个'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  

另一个选择是使用Path.GetDirectoryName和一个简单的Substring:

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