2011-09-25 2 views
4

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

Примеры:

Где

Àdónde

RapIDO

Aste

Можете ли вы помочь мне с этим?

+0

Что вы пробовали? Это бит акцента, который дает вам проблемы, или вы просто не знаете, с чего начать? –

+0

Акценты с какого языка (ов)? –

ответ

8

Regex:

\b\p{Lu}\p{L}*\b 

Java строка:

"(?U)\\b\\p{Lu}\\p{L}*\\b" 

Объяснение:

\b  # Match at a word boundary (start of word) 
\p{Lu} # Match an uppercase letter 
\p{L}* # Match any number of letters (any case) 
\b  # Match at a word boundary (end of word) 

Оговорка: Это работает только правильно в самых последних версиях Java (JDK7); для других вам может потребоваться заменить более длинное подрегрессию на \b. Как вы можете видеть here, возможно, придется использовать (престижность @tchrist)

(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])) 

для \b, поэтому строка Java будет выглядеть следующим образом:

"(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\]))\\p{Lu}\\p{L}*(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}\\[\\p{InEnclosedAlphanumerics}&&\\p{So}]\\]))" 
+1

Иногда мне жаль, что я не мог бы проголосовать за ответ не один раз. Это одна из них. –

+0

Я думаю, что для письма, вы, вероятно, хотите буквы или метки, а для прописных букв вы, возможно, захотите также и тэзовые. Поэтому, возможно, '(? U) \ b [\ p {Lu} \ p {Lt}] [\ pL \ pM] * \ b'. С некоторыми наборами данных вам также может понадобиться '\ p {верхний}', который является двоичным атрибутом Uppercase Unicode, поскольку это покрывает немного больше, чем просто буквы, такие как римские цифры. – tchrist

+0

\ p {L} * может не соответствовать номерам –

1

Код для того чтобы обнаружить прописные буквы в данном пункте. в этом случае ввод вводится как вход в консоль.

import java.io.*; 
import java.util.regex.*; 
import java.util.Scanner; 

public class problem9 { 

    public static void main(String[] args) { 
    String line1; 
    Scanner in = new Scanner(System.in); 
    String pattern = "(?U)\\b\\p{Lu}\\p{L}*\\b"; 

    line1 = in.nextLine(); 
    String delimiter = "\\s"; 
    String[] words1 = line1.split(delimiter); 

    for(int i=0; i<words1.length;i++){ 
     if(words1[i].matches(pattern)){ 
     System.out.println(words1[i]); 
     }  
    } 

    } 
} 

Если вы даете что-то вроде ввода

Input: Это моя первая программа

выход:

Это

Первый

Программа

+0

спасибо, очень полезно –

Смежные вопросы