2014-11-08 737 views
2

我試圖驗證用戶名輸入。應該有姓和名(所有字母),每個字母都以大寫字母開頭,兩個名字之間有一個空格,根本就沒有其他字符。以下是我的示例代碼:正則表達式精確匹配 - 第一個和最後一個空格之間的空格

my $name = "John Smith"; 

if ($name !~ /([A-Z]{1})([a-z]+)(\s)([A-Z]{1})([a-z]+){1}/g){ 
    print "No Match!"; 
}else{ 
    print "Match!"; 
} 

問題是,這與「John Smith」或「John Smith Joe」匹配。我沒有看到我的模式允許在第二個名字中的最後一組小寫字母之後有什麼,但它確實如此。我錯過了什麼?

謝謝!

回答

2

正則表達式可以多被簡化爲

^[A-Z][a-z]+\s[A-Z][a-z]+$ 

怎麼看的正則表達式在http://regex101.com/r/dX2hZ1/1

  • ^錨正則表達式在字符串的開頭匹配。這是確保字符串[A-Z]開始,大寫

  • [A-Z][a-z]+匹配大寫字母后跟任意數量的降低的情況下

  • \s一個空格

  • [A-Z][a-z]+相匹配的姓氏

  • 匹配
  • $將正則表達式錨定在字符串的末尾。確保沒有任何followes姓氏

你有什麼錯

([A-Z]{1})([a-z]+)(\s)([A-Z]{1})([a-z]+){1}名字和預期的名字相匹配的正則表達式。但它不考慮如果有任何事情。錨$確保它沒有其他任何東西。並且錨點^確保沒有任何東西預先匹配字符串。

+0

你應該解釋爲什麼他的方法不能正常工作以及你如何增加^ $修復它。但是,好的回答 – sshashank124 2014-11-08 20:01:28

+0

@ sshashank124只是增加詳細的答案。感謝您的指導:) – nu11p01n73R 2014-11-08 20:04:16

+1

我並不是說要破壞派對,但請注意有些名字不符合您的模式,例如「Paul McCartney」或某些蘇格蘭名字。另外,當允許國際用戶時,您可能不得不提防utf8。 – bytepusher 2014-11-08 20:13:43

相關問題