2014-06-30 112 views
2

現在我的程序使用這種模式.*[A-Z].*來匹配每個大寫字母的單詞。但是我的問題是,我需要一種模式,可以在單詞的開頭只用大寫字母來標識單詞。什麼是正確的正則表達式來匹配大寫字母只有第一個字母的單詞

例輸入現在我的計劃: -

我的名字是約翰,我來自浮羅交怡。

匹配的輸出: 我的Johan I langKawi。

但是使用我的模式中的一個詞,比如langKawi,其中大寫字母不在單詞的開頭,它仍然匹配。

任何人都可以幫助我匹配一個單詞只有第一個字母大寫的單詞,而我的文本/輸入只包含沒有數字和符號的字母字符。謝謝。

回答

4

使用單詞邊界匹配一個字開始之前,那麼這個詞,然後又字邊界:

\b[A-Z]\w*\b 

也就是說,在Java中,看起來是這樣的:

Pattern p = Pattern.compile("\\b([A-Z]\\w*)\\b"); 

String s = "My name is Johan and I am from langKawi."; 
Matcher matcher = p.matcher(s); 

while(matcher.find()){ 
    System.out.println(matcher.group(1)); 
} 

該輸出:

My 
Johan 
I 
+1

+1有效,但爲什麼捕獲組? – zx81

+0

@ zx81:否則,正則表達式將包含(潛在的)像空格這樣的詞邊界。爲了防止這種情況,您只將重要部分分組。 –

+1

@CommuSoft並非如此:'\ b'是一個零寬度斷言。它不消耗。 :) – zx81

2

這就是爲什麼他們發明\b

\b[A-Z][A-Za-z]*\b 

\b充當字邊界:它匹配空格(和其他分隔符)或字符串的開始和結束。

實例來捕獲所有部分:

import java.util.regex.*; 

public class HelloWorld{ 

    public static void main(String []args){ 
     Pattern p = Pattern.compile("\\b([A-Z][a-z]*)\\b"); 
     Matcher m = p.matcher("My name is Johan and I am from langKawi."); 
     while(m.find()) { 
      System.out.println(m.group(1)); 
     } 
    } 
} 

您可以測試代碼here

+1

你和nick的兼職,+1 :) – zx81

+0

非常感謝@CommuSoft。我應該學習如何使用\ b更多並瞭解它的功能。 – user3788818

相關問題