我正在尝试将骆驼箱转换为蛇箱。
像这样:
"LiveKarma"-> "live_karma"
"youGO"->"you_g_o"
我似乎无法让第二个例子像那样工作。它总是输出为 'you_go' 。我怎样才能让它输出'you_g_o'
我的代码:
(Regex.Replace(line, "(?<=[a-z0-9])[A-Z]", "_$0", RegexOptions.Compiled)).ToLowerInvariant()
Run Code Online (Sandbox Code Playgroud)
Gee*_*ide 14
由于将缩写转换为单独单词的选项并不适合很多人,因此我在 EF Core 代码库中找到了完整的解决方案。
以下是代码如何工作的几个示例:
TestSC -> test_sc
testSC -> test_sc
TestSnakeCase -> test_snake_case
testSnakeCase -> test_snake_case
TestSnakeCase123 -> test_snake_case123
_testSnakeCase123 -> _test_snake_case123
test_SC -> test_sc
Run Code Online (Sandbox Code Playgroud)
我稍微重写了它,以便您可以将其复制为现成的字符串扩展:
TestSC -> test_sc
testSC -> test_sc
TestSnakeCase -> test_snake_case
testSnakeCase -> test_snake_case
TestSnakeCase123 -> test_snake_case123
_testSnakeCase123 -> _test_snake_case123
test_SC -> test_sc
Run Code Online (Sandbox Code Playgroud)
您可以在这里找到原始代码: https://github.com/efcore/EFCore.NamingConventions/blob/main/EFCore.NamingConventions/Internal/SnakeCaseNameRewriter.cs
更新日期 2022 年 4 月 27 日:
此外,如果您正在寻找随时可用的第三方解决方案,您可以使用 Newtonsoft 库。代码的输出与上面的代码相同。
// using Newtonsoft.Json.Serialization;
var snakeCaseStrategy = new SnakeCaseNamingStrategy();
var snakeCaseResult = snakeCaseStrategy.GetPropertyName(text, false);
Run Code Online (Sandbox Code Playgroud)
这是将文本转换为蛇形大小写的扩展方法:
using System.Text;
public static string ToSnakeCase(this string text)
{
if(text == null) {
throw new ArgumentNullException(nameof(text));
}
if(text.Length < 2) {
return text;
}
var sb = new StringBuilder();
sb.Append(char.ToLowerInvariant(text[0]));
for(int i = 1; i < text.Length; ++i) {
char c = text[i];
if(char.IsUpper(c)) {
sb.Append('_');
sb.Append(char.ToLowerInvariant(c));
} else {
sb.Append(c);
}
}
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
将其放入某处的静态类(以 example 命名StringExtensions)并像这样使用它:
string text = "LiveKarma";
string snakeCaseText = text.ToSnakeCase();
// snakeCaseText => "live_karma"
Run Code Online (Sandbox Code Playgroud)
简单的基于 Linq 的解决方案...不知道它是否更快。基本上忽略连续的大写字母
public static string ToUnderscoreCase(this string str)
=> string.Concat((str ?? string.Empty).Select((x, i) => i > 0 && i < str.Length - 1 && char.IsUpper(x) && !char.IsUpper(str[i-1]) ? $"_{x}" : x.ToString())).ToLower();
Run Code Online (Sandbox Code Playgroud)
使用Newtonsoft包
public static string? ToCamelCase(this string? str) => str is null
? null
: new DefaultContractResolver() { NamingStrategy = new CamelCaseNamingStrategy() }.GetResolvedPropertyName(str);
public static string? ToSnakeCase(this string? str) => str is null
? null
: new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() }.GetResolvedPropertyName(str);
Run Code Online (Sandbox Code Playgroud)
下面的伪代码。本质上检查每个字符是否为大写,如果是则添加一个_,然后将字符添加为小写
var newString = s.subString(0,1).ToLower();
foreach (char c in s.SubString(1,s.length-1))
{
if (char.IsUpper(c))
{
newString = newString + "_";
}
newString = newString + c.ToLower();
}
Run Code Online (Sandbox Code Playgroud)