2013-11-20 67 views
-5
相匹配的人的名字

我試圖與解析名稱的正則表達式:創建,在Java中

  1. static final String NAME_REGEX="[A-Z][a-z]+([A-Z][a-z]+)?";
  2. static final String NAME_REGEX="(([A-Z][a-z]+\\s?)+)|(([A-Z]\.?\s?)*([A-Z][a-z]+\\s?)+)";

甚至有更長的時間,與我有更詳細的表述嘗試,我想創建一個小的最佳正則表達式的情況。

我的名單,我想使用Java正則表達式匹配:

B. Jack 
B.Jack Black 
B Jack Black 
B J Black 
BJ Black 
B.Jack Black 
B.J.Black 
B. Jack Black 
Jack B 
Jack B. 
Black Jack B. 
Jack B 
Black J.B 
Black JB 
Black J B 
Jack Black 
Black Jack Black 
Black J Black 
Black J. Black 
Black J.Black 
Albus P W B Dumbledore 
Albus P.W.B. Dumbledore 
+1

對於那些不知道。回答自己的問題完全沒問題。 [看這個meta討論](http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-if-i-knew-the-answer-before-asking) – HamZa

+0

當我解決這個問題時,我在一個筆記應用程序中寫了這個,我可以刪除一些其他較少的表達式和解釋如果我必須 – vamsiampolu

+0

我認爲你需要提出一個問題作爲一個標準的SO問題,例如包括嘗試解決方案(+代碼)。也許這就是爲什麼你有幾個downvotes :( – HamZa

回答

4

這種表達(([A-Z]\.?\s?)*([A-Z][a-z]+\.?\s?)+([A-Z]\.?\s?[a-z]*)*)確實接受他們之前it.Please檢查像RegexPlanetRubular網站的所有表達式。

這個正則表達式,可惜也匹配:

BlackJack 
    Ms Cf Gk 
    M Gh M 
    Mh G M 
    M G Mh 

和其他一些類似的

類似的組合我發現,使用單一的正則表達式的解決方案,以滿足所有的測試用例指定above.I會通過這個,一步一步來:

這個正則表達式([A-Z][a-z]+\s?)+匹配一組單詞,其中每個單詞以大寫字母開頭,所以這將照顧:

Jack 
Jack Black 
Black Jack Black 

現在,你需要能夠匹配一組大寫charecters的由.和/或space.In正則表達式語法.有特殊的意義,它的任何一個性格特徵相匹配,所以.+將匹配然後任選任何字符串都有。

因此,.必須使用\.,並且空格被寫爲\s,因爲您現在可能已經知道了。 [A-Z]指的是一組大寫字母,而[a-z]明顯指的是一組小寫字母。

所以這個表達式(([A-Z].?\s?)*([A-Z][a-z]+\s?)+)也將匹配:現在

B. Jack 
B.Jack Black 
B Jack Black 
B J Black 
BJ Black 
B.Jack Black 
B.J.Black 
B. Jack Black 

,除了.你看其他charecters像?這意味着匹配一個或無,*這意味着匹配一個或多個和+我們先前看到這意味着匹配一個或多個,表達式()代表一個組。您可以匹配代碼中的單個組,但如果沒有找到匹配的組,則值可能爲空。

現在在年底(([A-Z][a-z]+\.?\s?)+([A-Z]\.?\s?)*)縮寫會匹配一切的第一正則表達式匹配,也將匹配:

Jack B 
Jack B. 
Black Jack B. 
Jack B 
Black J.B 
Black JB 
Black J B 

現在你必須已經想通了,[A-Z]\.?\s?將匹配A.A。所以([A-Z]\.?\s?)*會這些的更多發生爲零。

正則表達式2和3的正則表達式使用|代表or會匹配所有的我們已經匹配到現在的投入,但那就太long.Instead您可以添加正則表達式的縮寫匹配雙方開始的組合和正則表達式的結尾。這樣一個表達式就是(([A-Z]\.?\s?)*([A-Z][a-z]+\.?\s?)+([A-Z]\.?\s?)*)。這個表達式可以匹配我們以前匹配的所有東西。

但對於Black J BlackBlack J. Black。我們目前要匹配,看起來像Black J B任何字符串的能力,你可以簡單地添加[a-z]*在年底代表的名字縮寫所以它看起來像(A-Z\.?\s?[a-z]*)組。

這種表達看起來像(([A-Z]\.?\s?)*([A-Z][a-z]+\.?\s?)+([A-Z]\.?\s?[a-z]*)*)

我也注意到,有時上的應用程序和其他一些地方的名字都寫完全使用大寫charecters該表達式

([A-Z]\.?\s?)+ 

會工作。