名称验证的难以正则表达式

时间:2016-09-26 15:12:41

标签: javascript regex validation

我试图编写正则表达式来检查提议的名称在游戏平台中是否有效。

规则:

  • 名称必须包含至少3个且不超过20个字母
  • 名称必须以大写字母
  • 开头
  • 名称不得连续使用两个大写字母
  • 允许使用空格,但必须以字母开头,后跟大写字母
  • 允许连字符,但必须以字母开头,后跟小写字母
  • 除非后跟空格或连字符
  • ,否则所有大写字母后面必须跟小写字母

我知道我可以单独检查字符串的长度,因此第一条规则是无关紧要的,但我认为我列出了它的好处。

测试用例(Pass):

  • Hello World
  • 你好世界
  • Bigsby Platt-slatt

测试用例(失败):

  • FOO
  • Hello world
  • 你好世
  • 33333333333

我可以用什么正则表达式来解决这个问题?期望仅使用正则表达式来执行此操作是否合理,还是需要使用不同的方法分析模式?

由于

1 个答案:

答案 0 :(得分:1)

这是一个可能的正则表达式:

(?!.*[A-Z]{2})(?!.*[^A-Za-z][ -])(?!.* ([^A-Z]|$))(?!.*-([^a-z]|$))^[A-Z].{2,19}$

请参阅regex101.com上的演示。

说明:

一些规则可以表示为"不能包含"一种规则,它们很容易用负面预测((?! ... ))实现:

  • 顺序没有两个首都:

    (?!.*[A-Z]{2})
    
  • 没有非字母后跟空格或连字符:

    (?!.*[^A-Za-z][ -])
    
  • 没有后跟非大写或字符串结尾的空格($):

    (?!.* ([^A-Z]|$)
    
  • 没有连字符后跟非小写字母或字符串结尾:

    (?!.*-([^a-z]|$))
    
  • 最后,实际匹配是这样的:大写后跟2 - 19个字符:

    ^[A-Z].{2,19}$