В некоторых случаях CultureInfo.CurrentCulture.TextInfo.ToTitleCase
не может быть обработан, например: апостроф '
.
string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
A regex также можно использовать \b[a-zA-Z]
для определения начального символа слова после границы слова \b
, тогда нам нужно просто заменить совпадение его эквивалентностью в верхнем регистре благодаря Regex.Replace(string input,string pattern,MatchEvaluator evaluator)
метод:
string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo
Регулярное выражение может быть настроено при необходимости, например, если мы хотим обработать случаи MacDonald
и McFry
, регулярное выражение становится: (?<=\b(?:mc|mac)?)[a-zA-Z]
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry
Если нам нужно обработать больше префиксов, нам нужно всего лишь изменить группу (?:mc|mac)
, например, добавить французские префиксы du, de
: (?:mc|mac|du|de)
.
Наконец, мы можем понять, что это регулярное выражение будет также соответствовать регистру MacDonald'S
для последнего 's
, поэтому нам нужно обработать его в регулярное выражение с отрицательным взглядом позади (?<!'s\b)
. В итоге имеем:
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry