С# - Заменить каждое письмо верхнего уровня с помощью подчеркивания и буквы

Как заменить каждое письмо верхнего уровня на поддерево и букву на С#? примечание: если символ уже не выполняется символом подчеркивания.

UPDATE: Например, MikeJones
превратится в Mike_Jones

Но Mike_Jones
не будет превращен в Mike__Jones

Является ли Regex лучшим подходом? С чего начать с этого?

Ответы

Ответ 1

Лучшее звуковое выражение:

string input = "Test_StringForYou";
string replaced = Regex.Replace(input, @"(?<!_)([A-Z])", "_$1");
Console.WriteLine(replaced);

Выход: _Test_String_For_You

Обязательно добавьте using System.Text.RegularExpressions;

Ответ 2

Итак, вы не хотите менять регистр букв! Я знаю, что вы этого не сказали, но некоторые из нас это поняли, потому что этот вопрос возникает так часто. В этом случае это регулярное выражение все, что вам нужно:

s = Regex.Replace(s, @"(?<=[a-z])([A-Z])", @"_$1");

Выполнение положительного lookbehind для строчной буквы также гарантирует, что вы не добавляете подчеркивание к началу строки.

Ответ 3

Regex.Replace(subject, "([A-Z])", "_$1");

изменяет Quick Brown Fox на _Quick _Brown _Fox

Это то, что вам нужно?

Ответ 4

Если вы хотите преобразовать это:

Пример текста

В

_sample _text

Тогда нет, RegEx не будет строго делать это, поскольку вы не можете преобразовать захваты или группы в замещающее выражение. Вы могли бы, конечно, использовать ответ Джейка и добавить к концу вызов .ToLower(), который заменит все заглавные буквы строчными буквами.

Если все, что вам нужно сделать, это добавить символ подчеркивания к каждой заглавной букве, которая его еще не имеет, то ответ Джейка в одиночку должен сделать трюк.

Ответ 5

using System.Text.RegularExpressions;

//-----------------------------------------------------------------

string str = Regex.Replace("MyString", @"([A-Z])", " $1").Trim();

//-----------------------------------------------------------------

str givs "My String"

Работает хорошо

Ответ 6

Не знаю, насколько это актуально, но вот простой способ сделать это.

private string StripInput(string input)
    {
        var output = input
            .Replace(" ", "_")
            .ToLower().Trim();
        return output;
    }

string TEST = "Hello World";
    litTest.Text = StripInput(TEST);

Появится как: hello_world