在C#中修剪字符串的最快方法

时间:2015-09-06 09:23:55

标签: c# .net

我需要修剪百万字符串中的路径,如下所示:

C:\workspace\my_projects\my_app\src\my_component\my_file.cpp

src\my_component\my_file.cpp

即。删除路径的绝对部分,最快的方法是什么?

我尝试使用正则表达式:

Regex.Replace(path,  @"(.*?)\src", ""),

5 个答案:

答案 0 :(得分:4)

我不会使用正则表达式,使用普通的旧方法。

如果路径前缀始终相同:

const string partToRemove = @"C:\workspace\my_projects\my_app\";

if (path.StartsWith(partToRemove, StringComparison.OrdinalIgnoreCase))
    path = path.Substring(partToRemove.Length);

如果前缀是可变的,您可以获得\src\的最后一个索引:

var startIndex = path.LastIndexOf(@"\src\", StringComparison.OrdinalIgnoreCase);
if (startIndex >= 0)
    path = path.Substring(startIndex + 1);

答案 1 :(得分:2)

使用new定义正则表达式并重新使用它 创建正则表达式会产生(重大)成本

string input = "This is   text with   far  too   much   " + 
                     "whitespace.";
string pattern = "\\s+";
string replacement = " ";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);

答案 2 :(得分:0)

不能认为比这更快

path.Substring(33);

src之前的内容是不变的。它从索引33开始。

C:\workspace\my_projects\my_app\src\my_component\my_file.cpp
                                    ^

如果不总是不变的话。你可以找到一次。并在循环中完成其余的工作。

int startInd = path.IndexOf(@"\src\") + 1;

// Do this inside loop. 1 million times
path.Substring(startInd);

答案 3 :(得分:0)

如果您的文件都以“src / filename.ext”结尾,那么您可以在.NET框架中使用Path类来解决它,并解决您对pathes和文件名的所有警告:

result = "src\" + Path.GetFileName(path);

因此,您应首先仔细检查转换是否需要很长时间。

答案 4 :(得分:0)

我不确定你是否需要速度,但如果总是获得完整路径,你可以做一个简单的.Substring()

var path = @"C:\workspace\my_projects\my_app\src\my_component\my_file.cpp";
Console.WriteLine(path.Substring(32));

但是,我认为你应该首先清理你的输入;在这种情况下,Uri类可以执行解析步骤:

var root = @"C:\workspace\my_projects\my_app\";
var path = @"C:\workspace\my_projects\my_app\src\my_component\my_file.cpp";
var relative = new Uri(root).MakeRelativeUri(new Uri(path));
Console.WriteLine(relative.OriginalString.Replace("/", "\\"));

请注意,Uri会将\更改为/.Replace原因。