#c# #regex
#c# #регулярное выражение
Вопрос:
Я пытаюсь проверить строку регистра заголовка «Sam And Will», используя выражение в юникоде p{Lt}. Но выражение не соответствует строке. Есть ли какая-либо альтернатива для этого. Пожалуйста, помогите. Спасибо.
MatchCollection matches = Regex.Matches("Sam And Will", @"p{Lt}");
foreach(Match match in matches)
{
Console.WriteLine(match.Value);
}
Ответ №1:
Регистр заголовка и верхний регистр как первый символ — это разные вещи:
Вопрос: Что такое titlecase? Чем оно отличается от прописного?
….Отображение заголовка в Юникоде отличается от отображения верхнего регистра тем, что ряд символов требует специальной обработки. В основном это лигатуры и орграфы, такие как ‘fl’, ‘dz’ и ‘lj’, плюс ряд политонных греческих символов. Например, U 01C7 (LJ) сопоставляется с U 01C8 (Lj), а не с U 01C9 (lj).
Если вы добавите орграф Dz
char c = 'u01F2';
по исходной строке (неважно, в начале слова или нет) оно будет найдено @"p{Lt}"
.
Кстати, просто чтобы проиллюстрировать разницу, если вы назначаете строку
CultureInfo ci = CultureInfo.GetCultureInfo("en-US");
string s = c " " char.ToLower(c, ci) " " char.ToUpper(c);
значение будет
"Dz dz DZ" // Dz - titlecase, dz - lowercase, DZ - uppercase
Для вашей задачи рассмотрите что-то вроде этого:
MatchCollection matches = Regex.Matches(@"Sam And Will", @"b(p{Lu})p{Ll}*b");
foreach (Match match in matches)
Console.WriteLine(match.Groups[1].Value);