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