C# 将骆驼格转换为蛇格,两个大写字母相邻

Liv*_*rma 5 c# regex

我正在尝试将骆驼箱转换为蛇箱。

像这样:

"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)


Gre*_*rko 8

这是将文本转换为蛇形大小写的扩展方法:

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)


dan*_*ofo 8

简单的基于 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)


Bar*_*uri 7

使用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)


gh9*_*gh9 1

下面的伪代码。本质上检查每个字符是否为大写,如果是则添加一个_,然后将字符添加为小写

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)

  • 您必须以不同的方式对待第一个字符,因为您不希望输入“LiveKarma”时使用“_live_karma”。另外,当*构建*这样的字符串时,您可能更喜欢使用“StringBuilder” (6认同)