具有非常特定规则的用户名的正则表达式

时间:2011-07-01 07:44:24

标签: regex regex-negation

我不是正则表形的忍者。我一直在调整这一小时,我相信SO上的某个人可以更有效地做到这一点。

这是一个带有一些稍微特殊要求的用户名的正则表达式(以容纳旧版用户名)。

规则:

  • 长度:最多24个字符,最少3个字符
  • 不得以空格开头或结尾
  • 以下任意数量(最多24个字段):
    • 0-9
    • A-Z
    • A-Z
    • 。 (点)
    • ''(空格)
  • 以下集合中的零个或一个:
    • @(at)
    • _(下划线)
    • - (连字符)
    • '(萎缩)

这是我到目前为止所拥有的:

^[^ ](?=[A-Za-z0-9. @_\-]{1,24}$)[a-zA-Z0-9_. ]*\.?[a-zA-Z0-9_]*[^ ]$

但这不太对劲。我不知道如何逃避'(撇号)

另外,我应该对允许零次或一次的字符使用另一种前瞻吗?

感谢。

更新: 请注意,target是带有C#

的.Net 4.0正则表达式库

2 个答案:

答案 0 :(得分:4)

您不应该使用单个正则表达式解决此问题,这会使代码难以阅读且难以修改。为每个规则编写一个函数,然后你的检查变得非常明确(更不用说维护者了)

if len(username) > = 3 && 
   len(username) < = 24 && 
   has_numbers(username) &&
   has_capital(username) ...

是否可以找到python中的测试实现,只是为了验证我的方法,here (那是在你用目标系统更新你的问题之前; - )

答案 1 :(得分:4)

这将是一个正则表达式解决方案,如果您可以阅读/可用/可维护,请自行决定。

(?!^.*?([@'_-]).*\1.*$)^(?! )[\w. @'-]{3,24}(?<! )$

here on Regexr

(?!^.*?([@'_-]).*\1.*$)是一个负向前瞻,如果找到您指定的其中一个字符,则将其放入捕获组1并确保不使用反向引用\1重复此操作。

^(?! )是一个负向前瞻,以确保字符串开头后没有空格。

[\w. @'-]{3,24}你允许的角色至少有3个,最多24个

(?<! )$是一个负面的背后隐藏,以确保在字符串结尾之前没有空格。