using System.Collections.Generic;
using System.Text.RegularExpressions;
private static readonly IEnumerable<(string Text, string Expectation)> Samples = new []
("TestSnakeCase", "test_snake_case"),
("testSnakeCase", "test_snake_case"),
("TestSnakeCase123", "test_snake_case123"),
("_testSnakeCase123", "_test_snake_case123"),
public static void Main()
Test(x => x.ToSnakeCase());
Console.WriteLine("------------------------------------");
Test(x => x.ToSnakeCase2());
private static void Test(Func<string, string> testFunc)
foreach(var sample in Samples)
var val = testFunc(sample.Text);
var result = val == sample.Expectation ? "true" : "false";
Console.WriteLine($"Test: {sample.Text}\nResult: {val}\nExpectation: {sample.Expectation}\nTest result: {result}\n");
public static class StringExtensions
public static string ToSnakeCase(this string str) =>
(x, i) => i > 0 && char.IsUpper(x)
public static string ToSnakeCase2(this string text) => Regex.Replace(Regex.Replace(text, "(.)([A-Z][a-z]+)", "$1_$2"), "([a-z0-9])([A-Z])", "$1_$2").ToLower();