c# - 使用 .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()
注意单引号。(使用双引号,您必须转义 $ 符号。)
解决方案
有很多方法可以做到这一点。虽然正则表达式可能是一种简单的方法
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();
}
推荐阅读
- java - 如何摆脱我的 java.lang.NumberFormatException?
- spring-boot - 从 Spring Boot 2.0.X 更新到 2.1.0 时出现 404
- bash - 将多行转换为一行并从中提取列
- sql - 一个多小时的简单雪花更新语句
- arrays - Swift 4 func prepare(for segue: UIStoryboardSegue, sender: Any?) 不使用 indexPath.row 更新 Int 变量
- linkedin - 显示来自其他组织的 LinkedIn 共享
- sql - 动态 SQL 语法错误 SQLScript SAP HANA
- php - 未找到包含文件中的 PHP 几个函数,而有些函数是
- javafx - 将滚动条添加到警报中
- javascript - NodeJS/Electron 给定的范围不在文档中