代码之家  ›  专栏  ›  技术社区  ›  Vaccano

使用.Net将Pascal大小写字符串转换为短划线[复制]

  •  0
  • Vaccano  · 技术社区  · 4 年前

    .Net是否有一种很好的方法来转换如下内容:

    Mystringthat很棒

    在这方面:

    我的绳子很好

    我希望我能用一个强大的指令来转换这个指令。

    (注:如果这是重复的,我很抱歉。我搜索了一下,只看到了帕斯卡案例的内容,而不是达什案例的内容。)

    编辑:这是我能搞懂的:

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

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

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

    1 回复  |  直到 4 年前
        1
  •  1
  •   TheGeneral    4 年前

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

    或者如果你喜欢循环

    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();
    
    }