2017-10-13 35 views
1

我似乎無法得到正確驗證用戶名字+姓氏和檢查中間名是這樣的:正則表達式的中間名初始有或沒有它

John Doe - Valid 
John M Doe - Valid 
John Mr Doe - Invalid 
John m Doe - Invalid 

所以,中間名只能是大寫字母。

我想出什麼樣的主意:

  • 名字+姓氏應該至少有3個字符 - OK
  • 應始終名字和姓氏 - OK

無法弄清楚如何如果存在,檢查MiddleName是否只有1個字符。

我現在的正則表達式是這樣的:

var isValid = /^((\b[a-zA-Z]{3,40}\b)\s*){2,}$/.test($(this).val()); 
// ^((\b[a-zA-Z]{3,40}\b)\s*){2,}$ - actual regex 
+0

你能否澄清一下,如果最大字符的姓和名可以有40嗎?他們有最大的字符限制嗎?我的意思是,如果在姓和名中可以有任意數量的字符,爲什麼在限制量詞中使用'40'? –

回答

3

您可以使用

/^[a-zA-Z]{3,40}(?:\s[A-Z])?\s[a-zA-Z]{3,40}$/ 

regex demo備註{3,40}是一個limiting quantifier,它匹配3到40次連續出現的量化子模式(即,[a-zA-Z]字母模式在這裏。如果您不打算限制名字和姓氏的上限(最大字母限制) ,只是刪除40

詳細

  • ^ - 字符串的開始
  • [a-zA-Z]{3,40} - 3至40 ASCII字母
  • (?:\s[A-Z])? - (這裏)的
    • \s可選序列 - 一個空白
    • [A-Z] - 單個大寫 ASCII字母
  • \s - 一個空白
  • [a-zA-Z]{3,40} - 3到40個ASCII字母
  • $ - 字符串結尾。

JS演示:

var strs = [' John Doe', 'John M Doe', 'John Mr Doe', 'John m Doe']; 
 
var rx = /^[a-zA-Z]{3,40}(?:\s[A-Z])?\s[a-zA-Z]{3,40}$/; 
 
for (var s of strs) { 
 
    console.log(s, "=>", rx.test(s)); 
 
}

+0

感謝您對正則表達式的解釋 –

+0

看起來不錯我會測試更多。也很好的解釋人 – 123onetwothree

+0

我可以強制執行該char(middlename)爲大寫字母嗎? – 123onetwothree

2

試試這個正則表達式:

/^[A-Za-z]{3,}\s+([A-Z]\s+)?[A-Za-z]{3,}$/ 

Check here了演示。


它是如何工作的說明:字符串的

  • ^開始。
  • [A-Za-z]{3,}檢查3個或更多字母。
  • \s+檢查一個或多個空白字符。
  • ([A-Z]\s+)?可選地檢查一個大寫字母字符後跟一個或多個whitepscae字符。所以它要麼匹配一個字母+空格,要麼沒有。
  • [A-Za-z]{3,}再次檢查3個或更多字母。
  • $字符串末尾。
+0

你的例子允許Jo3n Doe – 123onetwothree

+0

更多,它也匹配['____ ____'](https://regex101.com/r/gc5efi/3)。因爲它匹配字母數字*和*'_'字符,所以命名'\ w' a * word * char更爲合適。 –

+0

更新爲更嚴格的匹配。 – chocochaos

相關問題