Выражение в Юникоде @»p{Lt}» не соответствует строке регистра заголовка

#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);