public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) { return(s); } StringBuilder sb = new StringBuilder(); SnakeCaseState state = SnakeCaseState.Start; for (int i = 0; i < s.Length; i++) { if (s[i] == ' ') { if (state != SnakeCaseState.Start) { state = SnakeCaseState.NewWord; } } else if (char.IsUpper(s[i])) { switch (state) { case SnakeCaseState.Upper: bool hasNext = (i + 1 < s.Length); if (i > 0 && hasNext) { char nextChar = s[i + 1]; if (!char.IsUpper(nextChar) && nextChar != '_') { sb.Append('_'); } } break; case SnakeCaseState.Lower: case SnakeCaseState.NewWord: sb.Append('_'); break; } char c; #if !(DOTNET || PORTABLE) c = char.ToLower(s[i], CultureInfo.InvariantCulture); #else c = char.ToLowerInvariant(s[i]); #endif sb.Append(c); state = SnakeCaseState.Upper; } else if (s[i] == '_') { sb.Append('_'); state = SnakeCaseState.Start; } else { if (state == SnakeCaseState.NewWord) { sb.Append('_'); } sb.Append(s[i]); state = SnakeCaseState.Lower; } } return(sb.ToString()); }
/// <summary> /// 将字符串转换为蛇形策略 /// </summary> /// <param name="str">字符串</param> /// <returns></returns> public static string ToSnakeCase(string str) { if (string.IsNullOrEmpty(str)) { return(str); } StringBuilder sb = new StringBuilder(); SnakeCaseState state = SnakeCaseState.Start; for (var i = 0; i < str.Length; i++) { if (str[i] == ' ') { if (state != SnakeCaseState.Start) { state = SnakeCaseState.NewWord; } } else if (char.IsUpper(str[i])) { switch (state) { case SnakeCaseState.Upper: bool hasNext = (i + 1 < str.Length); if (i > 0 && hasNext) { char nextChar = str[i + 1]; if (!char.IsUpper(nextChar) && nextChar != '_') { sb.Append('_'); } } break; case SnakeCaseState.Lower: case SnakeCaseState.NewWord: sb.Append('_'); break; } sb.Append(char.ToLowerInvariant(str[i])); state = SnakeCaseState.Upper; } else if (str[i] == '_') { sb.Append('_'); state = SnakeCaseState.Start; } else { if (state == SnakeCaseState.NewWord) { sb.Append('_'); } sb.Append(str[i]); state = SnakeCaseState.Lower; } } return(sb.ToString()); }
/// <summary> /// 如:AreYouOk转成are_you_ok /// </summary> /// <param name="s"></param> /// <returns></returns> public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) { return(s); } StringBuilder stringBuilder = new StringBuilder(); SnakeCaseState snakeCaseState = SnakeCaseState.Start; for (int i = 0; i < s.Length; i++) { if (s[i] == ' ') { if (snakeCaseState != 0) { snakeCaseState = SnakeCaseState.NewWord; } } else if (char.IsUpper(s[i])) { switch (snakeCaseState) { case SnakeCaseState.Upper: { bool flag = i + 1 < s.Length; if (i > 0 && flag) { char c = s[i + 1]; if (!char.IsUpper(c) && c != '_') { stringBuilder.Append('_'); } } break; } case SnakeCaseState.Lower: case SnakeCaseState.NewWord: stringBuilder.Append('_'); break; } char value = char.ToLower(s[i], CultureInfo.InvariantCulture); stringBuilder.Append(value); snakeCaseState = SnakeCaseState.Upper; } else if (s[i] == '_') { stringBuilder.Append('_'); snakeCaseState = SnakeCaseState.Start; } else { if (snakeCaseState == SnakeCaseState.NewWord) { stringBuilder.Append('_'); } stringBuilder.Append(s[i]); snakeCaseState = SnakeCaseState.Lower; } } return(stringBuilder.ToString()); }
public string ToSnakeCaseNewtonsoftJson() { if (string.IsNullOrEmpty(name)) { return(name); } StringBuilder sb = new StringBuilder(); SnakeCaseState state = SnakeCaseState.Start; for (int i = 0; i < name.Length; i++) { if (name[i] == ' ') { if (state != SnakeCaseState.Start) { state = SnakeCaseState.NewWord; } } else if (char.IsUpper(name[i])) { switch (state) { case SnakeCaseState.Upper: bool hasNext = (i + 1 < name.Length); if (i > 0 && hasNext) { char nextChar = name[i + 1]; if (!char.IsUpper(nextChar) && nextChar != '_') { sb.Append('_'); } } break; case SnakeCaseState.Lower: case SnakeCaseState.NewWord: sb.Append('_'); break; } char c; #if HAVE_CHAR_TO_LOWER_WITH_CULTURE c = char.ToLower(s[i], CultureInfo.InvariantCulture); #else c = char.ToLowerInvariant(name[i]); #endif sb.Append(c); state = SnakeCaseState.Upper; } else if (name[i] == '_') { sb.Append('_'); state = SnakeCaseState.Start; } else { if (state == SnakeCaseState.NewWord) { sb.Append('_'); } sb.Append(name[i]); state = SnakeCaseState.Lower; } } return(sb.ToString()); }
public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) { return(s); } StringBuilder builder = new StringBuilder(); SnakeCaseState start = SnakeCaseState.Start; for (int i = 0; i < s.Length; i++) { if (s[i] == ' ') { if (start != SnakeCaseState.Start) { start = SnakeCaseState.NewWord; } continue; } if (char.IsUpper(s[i])) { switch (start) { case SnakeCaseState.Lower: case SnakeCaseState.NewWord: builder.Append('_'); break; case SnakeCaseState.Upper: { bool flag = (i + 1) < s.Length; if ((i > 0) & flag) { char c = s[i + 1]; if (!char.IsUpper(c) && (c != '_')) { builder.Append('_'); } } break; } } char ch2 = char.ToLower(s[i], CultureInfo.InvariantCulture); builder.Append(ch2); start = SnakeCaseState.Upper; continue; } if (s[i] == '_') { builder.Append('_'); start = SnakeCaseState.Start; } else { if (start == SnakeCaseState.NewWord) { builder.Append('_'); } builder.Append(s[i]); start = SnakeCaseState.Lower; } } return(builder.ToString()); }
public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) { return(s); } var sb = StringBuilderCache.Acquire(); SnakeCaseState state = SnakeCaseState.Start; for (int i = 0; i < s.Length; i++) { if (s[i] == ' ') { if (state != SnakeCaseState.Start) { state = SnakeCaseState.NewWord; } } else if (char.IsUpper(s[i])) { switch (state) { case SnakeCaseState.Upper: bool hasNext = (i + 1 < s.Length); if (i > 0 && hasNext) { char nextChar = s[i + 1]; if (!char.IsUpper(nextChar) && nextChar != '_') { sb.Append('_'); } } break; case SnakeCaseState.Lower: case SnakeCaseState.NewWord: sb.Append('_'); break; } char c; #if HAVE_CHAR_TO_LOWER_WITH_CULTURE c = char.ToLower(s[i], CultureInfo.InvariantCulture); #else c = char.ToLowerInvariant(s[i]); #endif sb.Append(c); state = SnakeCaseState.Upper; } else if (s[i] == '_') { sb.Append('_'); state = SnakeCaseState.Start; } else { if (state == SnakeCaseState.NewWord) { sb.Append('_'); } sb.Append(s[i]); state = SnakeCaseState.Lower; } } return(StringBuilderCache.GetStringAndRelease(sb)); }