2012-02-24 63 views
3

我正在嘗試使正則表達式匹配一個名稱,如:John Smith。唯一的規則是姓和名應以大寫字母開頭,並且必須至少有2個字符長。此外,姓氏限制爲最多20個字符,並且名稱之間存在昏迷或空白區域。到目前爲止,我有這樣的:正則表達式的姓名

/[A-Z][a-z]+(\s|,)[A-Z][a-z]{19}/ 

,當我在這個網站測試了它它不工作:http://www.regular-expressions.info/javascriptexample.html。我不確定我錯過了什麼。有任何想法嗎?

+2

(1)「不工作」是_永遠_足夠的問題說明。 (2)你爲什麼不使用瀏覽器控制檯來測試正則表達式? – 2012-02-24 16:28:47

+1

@MДΓΓБДLL,實際上,我認爲正則表達式是「不工作」是一個有效的問題描述的例外。在這個領域,它隱含地意味着「不符合我打算匹配的內容」,並且他準確地解釋了他希望匹配的內容。 – 2012-02-24 16:32:24

+1

這是一個非常可怕的*糟糕的方法,**你知道。這是無望的天真。考慮一下RenéeFleming,Tim O'Reilly,John Paul Jones,WilliamMᶜKinley,Malcolm X,Cher,Dominique Strauss-Kahn,FedericoPeña,FrançoisMitterand,NicolaeCeauşescu,蔣介石,MaríaJosé馬爾克斯,何塞瑪麗亞華雷斯或Federico del SagradoCorazóndeJesúsGarcíaLorca。 – tchrist 2012-02-24 16:42:29

回答

3

{19}更改爲{1,19}。就其本身而言,{19}表示「完全匹配前一個字符的19個」。 {1,19}的意思是「前一個字符的1和19之間的匹配」。

/[A-Z][a-z]+(\s|,)[A-Z][a-z]{1,19}/ 

更新:人們評論說,這不符合您的要求。正如你描述的那樣,它可能是你的需求的一個天真的實現,但它只是你修復bug的原始實現。如果你實際上是在尋找的名字,一個不太幼稚的做法是:

/^[A-Z][-'a-zA-Z]+,?\s[A-Z][-'a-zA-Z]{0,19}$/ 

這將趕上撇號或破折號名稱,允許名稱之間的逗號後面輸入一個空格,如果他們之間用逗號隔開,並允許用於單字母姓氏。但正如評論者所指出的,這仍然無法匹配一堆合法的名字,並且匹配絕對不像名字的東西。

它還增加了錨點^$以表示整個字符串必須匹配。如果你正在尋找一個子串,你可以刪除這些錨,並添加單詞邊界檢查來代替:

/\b[A-Z][-'a-zA-Z]+,?\s[A-Z][-'a-zA-Z]{0,19}\b/ 
+0

「U」是一個完全有效的姓氏。 – georg 2012-02-24 16:32:48

+0

@ thg435,也許,但這不是OP想要正則表達式匹配的。他特別說,「姓應該以大寫字母開頭,並且必須至少有2個字符長」。 – 2012-02-24 16:33:54

+0

這對RenéeFleming或Tim O'Reilly不起作用。或者Malcolm X.或者Dominique Strauss-Kahn。加油吧,變得真實。 – tchrist 2012-02-24 16:35:49

0
/^[A-Z][a-z]+[\s|,][A-Z][a-z]{1,19}$/.test("John Smith") // true 
+0

這個正則表達式允許數字值。我怎麼能實現它 – bhavikshah28 2015-09-18 14:37:08

0

這應該爲你

\b[A-Z]+.+[?^ ][A-Z].{1,19}|\b[A-Z]+.+[?^,][A-Z].{1,19} 

工作,這將啓動與一個開始字,檢查第一個字母是否爲大寫字母,將第一個字符與空格或逗號相匹配,然後檢查以確保下一個單詞的第一個字母大寫,並匹配所有後面的19個字符。還要確保每個名稱的長度都是2個或更多字符。

0

{19}表示姓氏在第一個大寫字符後必須正好有19個小寫字符。

1

這裏有一些表達,這可能有助於爲更復雜的名字

(^[A-Z][a-z]*$) - A typical First Name or Last Name like Thomas 
(^[A-Z][a-z][A-Z][a-z]*$) - names like McDonald 
(^[A-Z][a-z]*(-|\s)[A-Z][a-z]*$) - names like Tonya-Smith or Tonya Smith 
(^[A-Z]('|’)[A-Z][a-z]*$) - names like Tim O’Reilly 
(^[a-z]+\s[A-Z][a-z]*$) - names like von Gogh 
相關問題