首页 > 解决方案 > 使用 .Net 将 Pascal Case 字符串转换为 Dash Case

问题描述

.Net 是否有一个很好的方法来转换这样的东西:

MyStringThatIsGreat

进入这个:

我的字符串很棒

最后,我计划在 powershell 脚本中调用它,所以我希望有一些命令可以转换为 powershell(而不是一大块代码)。

(注意:如果这是重复的,我很抱歉。我进行了搜索,只看到了到帕斯卡案例而不是从它到破折号案例的东西。)

编辑:这是我能够拼凑在一起的:

var pascalCase = "MyReally-CoolMFAString";
var dashCase = Regex.Replace(pascalCase, @"(?<!^)(?<!-)((?<=\p{Ll})\p{Lu}|\p{Lu}(?=\p{Ll}))", "-$1").ToLower();
Console.WriteLine(dashCase);

输出是:

我的真酷 mfa 字符串

为了使它与 powershell 一起工作,这是命令:

[System.Text.RegularExpressions.Regex]::Replace('MyReally-CoolMFAString', '(?<!^)(?<!-)((?<=\p{Ll})\p{Lu}|\p{Lu}(?=\p{Ll}))', '-$1').ToLower()

注意单引号。(使用双引号,您必须转义 $ 符号。)

标签: c#.net

解决方案


有很多方法可以做到这一点。虽然正则表达式可能是一种简单的方法

var input = "MyStringThatIsGreat";

var result = Regex.Replace(input, "(?<!^)([A-Z])", "-$1").ToLower();

Console.WriteLine(result);

或者如果你喜欢 for 循环

var sb = new StringBuilder();
for (var i = 0; i < input.Length; i++)
   if (i != 0 && char.IsUpper(input[i]))
      sb.Append($"-{input[i]}");
   else
      sb.Append(input[i]);

Console.WriteLine(sb.ToString().ToLower());

或林克

var result = string
   .Concat(input
   .Select((x, i) => char.IsUpper(x) && i != 0 ? $"-{x}" : x.ToString()))
   .ToLower();

输出

my-string-that-is-great

注意:这两个例子可能都不太具有文化意识。


基准

Job=.NET Core 5.0  Runtime=.NET Core 5.0

|        Method |     Mean |    Error |   StdDev |
|-------------- |---------:|---------:|---------:|
| RegexStandard | 988.6 ns | 19.26 ns | 31.65 ns |
| RegExCompiled | 566.5 ns | 11.08 ns | 16.24 ns |
| StringBuilder | 466.1 ns |  5.54 ns |  4.91 ns |
|        Concat | 792.4 ns | 15.09 ns | 16.77 ns |

测试

[SimpleJob(RuntimeMoniker.NetCoreApp50)]
public class DumbTest
{
   private string _input = "MyStringThatIsGreat";
   private Regex compiled = new Regex("(?<!^)([A-Z])", RegexOptions.Compiled);

   [Benchmark]
   public string RegexStandard()
      => Regex.Replace(_input, "(?<!^)([A-Z])", "-$1").ToLower();

   [Benchmark]
   public string RegExCompiled()
      => compiled.Replace(_input, "-$1").ToLower();

   [Benchmark]
   public string StringBuilder()
   {
      var sb = new StringBuilder();
      for (var i = 0; i < _input.Length; i++)
         if (i != 0 && char.IsUpper(_input[i]))
            sb.Append($"-{_input[i]}");
         else
            sb.Append(_input[i]);
      return sb.ToString().ToLower();

   }

   [Benchmark]
   public string Concat() =>
      string
         .Concat(_input.Select((x, i) => char.IsUpper(x) && i != 0 ? $"-{x}" : x.ToString()))
         .ToLower();

}

推荐阅读