2011-09-25 75 views
4

我想创建一个Java正则表达式来获取以大写字母开头的所有单词,然后是大写或小写字母,但这些字母可能包含重音符号。如何抓取以大写字母开头的所有单词?

例子:

Àdónde

RAPIDO

ASTE

你能帮我吗?

+0

你尝试过什么?口音是否给你带来麻烦,还是你不知道从哪里开始? –

+0

口音来自哪种语言? –

回答

8

正则表达式:

\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 {upper}'这是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]); 
     }  
    } 

    } 
} 

如果你给输入类似

输入:这是我的第一个程序

输出:

首先

计划

+0

谢谢,非常有用 –

相关问题