Обнаружение слов, начинающихся с заглавных букв с использованием регулярных выражений - PullRequest
3 голосов
/ 26 марта 2011

Я хочу извлечь слова, начинающиеся с заглавной буквы, включая ударные, используя регулярные выражения в Java.

Это мое условие для слов, начинающихся с заглавной буквы от A до Z:

if (link.text().matches("^[A-Z].+") == true) 

Но я также хочу слова, которые начинаются с акцентированного заглавного символа.

У вас есть идеи?

Ответы [ 3 ]

4 голосов
/ 26 марта 2011

Начните с http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

\p{javaUpperCase}   Equivalent to java.lang.Character.isUpperCase()
4 голосов
/ 26 марта 2011

Чтобы соответствовать заглавной букве в начале строки, вам нужен шаблон ^\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 в настоящее время является вашей реальной возможностью.

1 голос
/ 26 марта 2011

java имеет метод java.lang.Character.isUpperCase, он не совсем регулярное выражение, но может удовлетворить.

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html#isUpperCase(int)

...