[英]Regex for first and last name
我正試圖制作一個正則表達式,它必須匹配一個名稱:John Smith。 唯一的規則是名字和姓氏應以大寫字母開頭,並且長度必須至少為2個字符。 姓氏最多也有20個字符的限制,名稱之間有一個昏迷或空格。 到目前為止我有這個:
/[A-Z][a-z]+(\s|,)[A-Z][a-z]{19}/
當我在這個網站上測試它時它不起作用: http : //www.regular-expressions.info/javascriptexample.html 。 我不確定我錯過了什么。 有任何想法嗎?
將{19}
更改為{1,19}
。 就其本身而言, {19}
意思是“恰好匹配前一個字符中的19個”。 {1,19}
表示“匹配前一個字符的1到19之間”。
/[A-Z][a-z]+(\s|,)[A-Z][a-z]{1,19}/
更新:人們評論說這不符合您的要求。 正如您所描述的那樣,它可能是您的需求的天真實現,但它只是您修復了錯誤的原始實現。 如果您實際上在尋找名稱,那么一個不那么天真的實現可能是:
/^[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/
以下是一些可能有助於更復雜名稱的表達式
(^[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
你需要{0,19}
而不僅僅是{19}
。 后者意味着“恰好19個字符”。
"John Smith".match(/^[A-Z][a-z]{0,19}[\s,][A-Z][a-z]{0,19}$/)
當然,這個正則表達式與許多完全有效的名稱不匹配,如“JoséOrtegay Gasset”或“Charles de Batz-Castelmore d'Artagnan”。
根據可接受姓氏的長度,您可以將“{0,19}”替換為“{1,19}”或“{2,19}”。 這同樣適用於名字。
/^[A-Z][a-z]+[\s|,][A-Z][a-z]{1,19}$/.test("John Smith") // true
這應該適合你
\b[A-Z]+.+[?^ ][A-Z].{1,19}|\b[A-Z]+.+[?^,][A-Z].{1,19}
這從單詞的開頭開始,檢查第一個字母是大寫字母,將第一個單詞匹配到空格或逗號,然后檢查以確保下一個單詞的第一個字母大寫,並匹配最多19個字母。之后的人物。 還要確保每個名稱長度為2個或更多字符。
{19}表示姓氏在第一個大寫字符后必須包含正好19個小寫字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.