我不是正则表形的忍者。我一直在调整这一小时,我相信SO上的某个人可以更有效地做到这一点。
这是一个带有一些稍微特殊要求的用户名的正则表达式(以容纳旧版用户名)。
规则:
这是我到目前为止所拥有的:
^[^ ](?=[A-Za-z0-9. @_\-]{1,24}$)[a-zA-Z0-9_. ]*\.?[a-zA-Z0-9_]*[^ ]$
但这不太对劲。我不知道如何逃避'(撇号)
另外,我应该对允许零次或一次的字符使用另一种前瞻吗?
感谢。
更新: 请注意,target是带有C#
的.Net 4.0正则表达式库答案 0 :(得分:4)
您不应该使用单个正则表达式解决此问题,这会使代码难以阅读且难以修改。为每个规则编写一个函数,然后你的检查变得非常明确(更不用说维护者了)
if len(username) > = 3 &&
len(username) < = 24 &&
has_numbers(username) &&
has_capital(username) ...
是否可以找到python中的测试实现,只是为了验证我的方法,here (那是在你用目标系统更新你的问题之前; - )
答案 1 :(得分:4)
这将是一个正则表达式解决方案,如果您可以阅读/可用/可维护,请自行决定。
(?!^.*?([@'_-]).*\1.*$)^(?! )[\w. @'-]{3,24}(?<! )$
(?!^.*?([@'_-]).*\1.*$)
是一个负向前瞻,如果找到您指定的其中一个字符,则将其放入捕获组1并确保不使用反向引用\1
重复此操作。
^(?! )
是一个负向前瞻,以确保字符串开头后没有空格。
[\w. @'-]{3,24}
你允许的角色至少有3个,最多24个
(?<! )$
是一个负面的背后隐藏,以确保在字符串结尾之前没有空格。