我们的客户在其注册表中存储了一个字符串,这是一个可执行命令。该字符串可以或可以不具有目标路径周围的引号,并且可以具有或不具有参数。例如:
“C:\ path \ file.exe”param1 = value1 param2 = value2
C:\ path \ file.exe param1 = value1 param2 = value2
“C:\路径\ file.exe程式”
C:\路径\ file.exe程式
“C:\ path \ file with spaces.exe”param1 = value1 param2 = value2
“C:\ path \ file with spaces.exe”
我需要获取目标路径的目录,即C:\path
。
Path.GetDirectoryName
,但是因为“路径中存在非法字符”而失败了。ProcessStartInfo
对象,但似乎没有智能来解析字符串。Uri
,但也没有运气。我有一个使用正则表达式的解决方案(我将在下面作为答案发布),但这看起来像是“必须有一个内置的.Net-helper-class-for-this “问题。
我是否缺少一个课程,或者只是没有正确使用上述课程?
答案 0 :(得分:1)
这是一个有效的正则表达式。但是,正如我在我的问题中所说,有更好的方法吗?或者有这种情况会失败吗?
Regex pattern = new Regex(@"^(?<quot>"")?(?<path>(?(quot)[^""]|\S)*)", RegexOptions.ExplicitCapture);
var match = pattern.Match(value);
return Path.GetDirectoryName(match.Groups["path"].Value);
答案 1 :(得分:0)
我发布了:
var strings = value.Split(" ", 2);
var firstString = strings.Length == 0 ? string.Empty : strings[0];
return Path.GetDirectoryName(firstString );
然后我打了自己。
然后我看到http://community.bartdesmet.net/blogs/bart/archive/2009/02/21/net-4-0-system-shell-commandline-parsing-part-1.aspx有用吗? (虽然它看起来不像处理解析的这个方面,但它实际上并不存在!)
没有一个标准的System.IO类提供你正在寻找的任何类型的解析,所以我说你的正则表达式没问题,除非有人找到一个常见的解析。
在Reflector中,所有执行命令行解析的System.Environment
代码似乎都是Native,所以我非常有信心你没有错过任何标准API用于此目的 - 这种考虑(如何文件名被表示)被认为是.NET的外部(这是有意义的,因为它是特定于平台的。)