Чтобы соответствовать заглавной букве в начале строки, вам нужен шаблон ^\p{Lu}
.
К сожалению, Java не поддерживает обязательное свойство \p{Uppercase}
, необходимое для соответствия RL1.2 UTS # 18.
Это едва ли не единственное, чего не хватает в регулярных выражениях Java, чтобы соответствовать даже уровню 1, самой простой базовой функциональности Unicode.Без уровня 1 вы действительно не сможете работать с тестом Unicode, используя регулярные выражения.Слишком много сломано или отсутствует.
RL1.1 UTS # 18 будет наконец встретиться с JDK7, но я не верю, что в настоящее время есть какие-либо планы встретиться с RL1.2, RL1.2а, или любой другой, которой в настоящее время не хватает, и даже не соответствует двум Сильным Рекомендациям.Увы!
Действительно, из очень короткого списка обязательных свойств, требуемых RL1.2, в Java отсутствуют \p{Alphabetic}
, \p{Uppercase}
, \p{Lowercase}
, \p{White_Space}
, \p{Noncharacter_Code_Point}
, * 1020Свойства *, \p{ANY}
и \p{ASSIGNED}
.Все они являются обязательными, но либо полностью отсутствуют, либо не соответствуют стандарту Unicode в отношении их определений.Это также проблема с POSIX-совместимыми свойствами в Java: все они нарушены в отношении UTS # 18.
До JDK7 в нем также отсутствовали обязательные свойства Script
.JDK7 наконец-то получает свойства скрипта, но это все, ничего больше.До Java еще не так много лет, чтобы встретить даже RL1.2a, который является ежедневной добычей для миллионов программистов.
В JDK7 вы, наконец, можете также использовать свойства из двух частей в форме \p{name=value}
, если они являются блочными, сценариями или общими категориями.Это означает, что они одинаковы в классе Pattern в JDK7:
\p{Block=Number_Forms}
, \p{blk=Number_Forms}
и \p{InNumber_Forms}
. \p{Script=Latin}
, \p{sc=Latin}
, \p{IsLatin}
и \p{Latin}
. \p{General_Category=Lu}
, \p{GC=Lu}
и \p{Lu}
.
Однако вы не можете использовать длинные формы, такие как \p{Lowercase_Letter}
и\p{Letter_Number}
, и POSIX-выглядящие свойства нарушены с точки зрения RL1.2a.Плюс суперосновные свойства из RL1.2, такие как \ p {White_Space} и \ p {Alphabetic} по-прежнему отсутствуют.
Был некоторый разговор о попытке исправить \b
и \B
, которые с треском разбиты по отношению к \w
и \W
, но я не знаю, как они собираются исправитьвсе это без полного соответствия RL1.2a.И нет, я понятия не имею, когда они добавят эти основные свойства в Java.Вы также не можете обойтись без них.
Чтобы полностью работать с Unicode с использованием регулярных выражений в Java даже на уровне 1, вы действительно не можете использовать стандартный класс Pattern, с которым поставляется Java.Самый простой способ сделать это - использовать JNI для подключения к библиотекам регулярных выражений ICU с помощью кода Google Android, который доступен .Существуют и другие языки, которые по крайней мере соответствуют Уровню 1 (или лучше) UTS # 18, но если вы хотите остаться в Java, ICU в настоящее время является вашей реальной возможностью.