C # Строка с заглавными буквами, но только после определенных знаков препинания - PullRequest
0 голосов
/ 14 апреля 2011

Я пытаюсь найти эффективный способ взять входную строку и использовать первую букву после каждого знака пунктуации (. : ? !), за которым следует пробел.

Ввод:

"Я что-то съел. Но я не сделал: вместо этого нет. что ты думаешь? я не думай! извини меня.мои "

Выход:

"Я что-то ел. Но я не сделал: Вместо этого нет. Как вы думаете? я не думай! Извините меня. Мой "

Очевидным было бы разделить его, а затем использовать первый символ каждой группы с заглавной буквы, а затем объединить все. Но это безобразно. Какой лучший способ сделать это? (Я думаю Regex.Replace, используя MatchEvaluator, который использует первую букву, но хотел бы получить больше идей)

Спасибо!

Ответы [ 4 ]

4 голосов
/ 14 апреля 2011

Быстро и просто:

static class Ext
{
    public static string CapitalizeAfter(this string s, IEnumerable<char> chars)
    {
        var charsHash = new HashSet<char>(chars);
        StringBuilder sb = new StringBuilder(s);
        for (int i = 0; i < sb.Length - 2; i++)
        {
            if (charsHash.Contains(sb[i]) && sb[i + 1] == ' ')
                sb[i + 2] = char.ToUpper(sb[i + 2]);
        }
        return sb.ToString();
    }
}

Использование:

string capitalized = s.CapitalizeAfter(new[] { '.', ':', '?', '!' });
2 голосов
/ 17 мая 2011

Я использую метод расширения.

public static string CorrectTextCasing(this string text)
{
    //  /[.:?!]\\s[a-z]/ matches letters following a space and punctuation,
    //  /^(?:\\s+)?[a-z]/  matches the first letter in a string (with optional leading spaces)
    Regex regexCasing = new Regex("(?:[.:?!]\\s[a-z]|^(?:\\s+)?[a-z])", RegexOptions.Multiline);

    //  First ensure all characters are lower case.  
    //  (In my case it comes all in caps; this line may be omitted depending upon your needs)        
    text = text.ToLower();

    //  Capitalize each match in the regular expression, using a lambda expression
    text = regexCasing.Replace(text, s => (s.Value.ToUpper));

    //  Return the new string.
    return text;

}

Тогда я могу сделать следующее:

string mangled = "i'm A little teapot, short AND stout. here IS my Handle.";
string corrected = s.CorrectTextCasing();
//  returns "I'm a little teapot, short and stout.  Here is my handle."
2 голосов
/ 14 апреля 2011

Попробуйте это:

string expression = @"[\.\?\!,]\s+([a-z])";
string input = "I ate something. but I didn't: instead, no. what do you think? i think not! excuse me.moi";
char[] charArray = input.ToCharArray();
foreach (Match match in Regex.Matches(input, expression,RegexOptions.Singleline))
{
    charArray[match.Groups[1].Index] = Char.ToUpper(charArray[match.Groups[1].Index]);
}
string output = new string(charArray);
// "I ate something. But I didn't: instead, No. What do you think? I think not! Excuse me.moi"
0 голосов
/ 14 апреля 2011

Используя маршрут Regex / MatchEvaluator, вы можете найти совпадения на

"[.:?!]\s[a-z]"

и использовать весь заглавные буквы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...