【问题标题】:Regex for Name - Capitalization and No Special Characters名称的正则表达式 - 大写且无特殊字符
【发布时间】:2016-04-30 06:25:05
【问题描述】:

我正在尝试验证仅以英文字母书写的名称。其他特殊字母如ç、é等除外。

我的要求是:

  1. 每个单词都应以大写字母开头 (Peter Svidler)
  2. 单个单词不应有两个大写字母(PEter Svidler 必须失败)
  3. 不允许使用数字。 (Peter Svidler9 或 Peter 9 Svidler 应该会失败)
  4. 不允许使用特殊字符。 (Peter Svidler。或 Peter S.vidler 必须失败)
  5. 要匹配的案例: 一种。 R G S Devan 或 Achar K K S R(在开头或结尾允许尽可能多的大写首字母) 湾。一个词或多个词(Chandra、Chandra Shekhar Raju、...)

我尝试通过 2 个表达式进行验证

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

^[a-zA-Z ]*$

但它与 PEter SVidler 或 PETER SVIDLER 匹配。

如何解决?

【问题讨论】:

    标签: java android regex


    【解决方案1】:

    牢记您的要求,我提出了this 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包围以允许边界。如果需要,您可以使用锚定。

    【讨论】:

    【解决方案2】:

    基于@noob 的想法,我想出了这个:

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

    匹配:

    1. 约翰·D·E·F·W
    2. D E S 马修
    3. 阿拉迪·克里希纳·斯瓦米·艾亚尔
    4. Raja Ravi Varma M
    5. A B C D E F

    Match case 5 是唯一美中不足的地方。我认为鉴于要求,RegEx 无法阻止它。我正在考虑在输入字符串通过正则表达式后对其进行标记,并在验证器方法中检查字符串长度。

    我错过了什么吗?

    我已经测试了这个 RegEx here

    【讨论】:

      【解决方案3】:

      这是一个变体:

      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

      【讨论】:

      • 使用\w 也可以匹配_\s 也将允许其他 whitespaces 所以使用单个空格。最好使用[A-Z],因为要求仅限
      • 似乎您只替换了\w,因为您还需要将\s 替换为仅space。因为\s 也允许换行。
      【解决方案4】:
      ^((\b[A-Z][a-z]{1,15})\s*){2,15}$
      

      适用于

      • Foysal Ahmed Emon
      • 福伊萨尔·艾哈迈德

      不适合

      • foysal 艾哈迈德
      • 恶魔
      • 艾哈迈德

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        相关资源
        最近更新 更多