从现有的字符串构建新的类似路径的字符串

时间:2019-03-22 08:26:55

标签: c# .net string

我想修改看起来像

的源字符串
"one.two.three" 

并将其转换为带有斜线的字符串,以将其用作具有以下结构的文件夹字符串:

"one\one.two\one.two.three"

除了下面的解决方案之外,您知道实现此目的的更优雅的方法吗?我对for循环不太满意。

var folder = "one.two.three";
var folderParts = folder.Split('.');
var newFolder = new StringBuilder();
for (int i = 0; i < folderParts.Length; i++)
{
    for (int j = 0; j < i; j++)
    {
       if (j == 0)
       {
          newFolder.Append("\\");
       }

       newFolder.Append($"{folderParts[j]}.");
    }

    newFolder.Append(folderParts[i]);
}

4 个答案:

答案 0 :(得分:9)

您可以使用Regex非常简洁

var newFolder = Regex.Replace(folder, @"\.", @"\$`.");

这在每个期间都匹配。每次找到句点时,都会插入一个反斜杠,然后在匹配项之前插入整个输入字符串($`)。我们必须在末尾再次添加句点。

因此,步骤为(<和>表示在该步骤由替换插入的文本):

  1. 第一阶段比赛。 one<\one>.two.three
  2. 第二期比赛。 one\one.two<\one.two>.three
  3. 结果:one\one.two\one.two.three

要获得奖励积分,请使用Path.DirectorySeparatorChar来确保跨平台的正确性。

var newFolder = Regex.Replace(folder, @"\.", $"{Path.DirectorySeparatorChar}$`.")

这是另一种错误的方式:

var a = "";
var newFolder = Path.Combine(folder.Split('.')
    .Select(x => a += (a == "" ? "" : ".") + x).ToArray());

答案 1 :(得分:8)

您可以尝试 Linq

  string folder = "one.two.three";
  string[] parts = folder.Split('.');

  string result = Path.Combine(Enumerable
    .Range(1, parts.Length)
    .Select(i => string.Join(".", parts.Take(i)))
    .ToArray());

  Console.Write(newFolder);

结果:

 one\one.two\one.two.three 

答案 2 :(得分:3)

您只能像这样在一个循环中前进:

    var folder = "one.two.three";
    var newFolder = new StringBuilder();

    int index = -1;
    while (index + 1 < folder.Length) {
        index = folder.IndexOf('.', index + 1);
        if (index < 0) {
            newFolder.Append(folder);
            break;
        }
        else {
            newFolder.Append(folder, 0, index);
            newFolder.Append(Path.DirectorySeparatorChar);
        }
    }

您可以try it out here

答案 3 :(得分:3)

与首先拆分字符串相比,我发现从您拥有的内容开始并减少它更优雅:

var folder = "one.two.three";
var newFolder = string.Empty;
for (var f = folder; f.Any(); f = f.Remove(Math.Max(f.LastIndexOf('.'), 0)))
    newFolder = Path.Combine(f, newFolder);

Console.WriteLine(newFolder);

输出:

one\one.two\one.two.three