2016-01-23 126 views
1

我想驗證只用英文字母書寫的名稱。其他特殊字母如ç,é等不包括在內。正則表達式的名稱 - 大寫和無特殊字符

我的要求是:

  1. 每一個字應該用大寫字母(彼得·斯維德勒)
  2. 的一個字不應該有兩個大寫字母開頭(彼得·斯維德勒一定會失敗)
  3. 沒有數字是允許。 (Peter Svidler9或Peter 9 Svidler應該失敗)
  4. 不允許特殊字符。 (Peter Svidler或Peter S.vidler必須失敗)
  5. 需要匹配的案例: a。 R G S Devan或Achar K K S R(在開始或結束時允許儘可能多的首字母大寫) b。一個字或一個以上的字(錢德拉,錢德拉·謝卡爾拉朱,...)

我試圖通過2個表達

\b[A-Z].*?\b 

^[a-zA-Z ]*$ 

驗證但它匹配PEter SVidler或PETER SVIDLER。

這怎麼解決?

回答

0

這是一個變化:

not_this|forget_this|nevermind_this|(but_keep_this) 

所以,你能想出:

^(?:\b[a-z]|\b[A-Z]{2,})(*SKIP)(*FAIL)|^([A-Za-z ]+)$ 

見一記regex demo on regex101.com

+0

使用'\ w'也允許'_'匹配。 '\ s'也會允許其他'whitespaces',所以使用單個空格。更好地使用'[A-Z]'是因爲這個需求僅僅是** **。 – 2016-01-23 19:55:02

+0

@noob:好點,更新。 – Jan

+0

好像你只替換了'\ w',因爲你還需要用'空格'替換'\ s'。因爲'\ s'也允許換行符。 – 2016-01-23 20:24:34

1

保持你的要求,我想出了this regex.

Regex\b[A-Z][a-z]* [A-Z][a-z]*([A-Z])?\b

說明

[A-Z][a-z]*名字相匹配,第一個字符是資本和他們的休息小可能是0 or many後面加一個空格。

[A-Z][a-z]*匹配姓氏或中間名,與名字相同。

([A-Z])?可選的姓氏匹配在Botvinnik M MVivekanand P V

通過\b環繞,讓邊界。如果這是你需要的,你可以使用錨定。

+1

更新了您的顯示捕獲的組:https://regex101.com/r/qR0jA9/2(對於您的解決方案,爲+1)。 – Jan

1

大廈@noob的想法,我想出了這一點:

\b[A-Z][a-z]*([A-Z][a-z]*)*\b 

它匹配:

  1. 約翰DEFW
  2. DES馬修
  3. Alladi克里希納·斯瓦米艾亞爾
  4. Raja Ravi Varma M
  5. A B C D E F

比賽案例5是美中不足的。我假定給出了這些要求,RegEx無法阻止它。我正在考慮在輸入字符串通過RegEx並檢驗驗證器方法中的字符串長度後對它進行標記。

我錯過了什麼嗎?

我已測試此RegEx here