首页 文章

用于允许数字,字母和空格的用户名的正则表达式

提问于
浏览
3

我正在寻找一些可以用来检查有效用户名的正则表达式代码 .

我希望用户名包含字母(大写和小写),数字,空格,下划线,短划线和点,但用户名必须以字母或数字开头和结尾 .

理想情况下,它也不应允许上面列出的任何特殊字符连续重复多次,即它们可以根据需要具有尽可能多的空格/点/短划线/下划线,但必须至少有一个数字或他们之间的信 .

我也有兴趣知道你认为这是一个很好的用户名系统吗?我已经看过一些可以做到这一点的正则表达式,但它们似乎都没有允许空格,我希望用户名中有一些空格 .

谢谢 :)

3 回答

  • 2

    您不必为所有内容使用正则表达式 . 我发现像"no two consecutive characters"这样的要求通常会使正则表达式变得如此丑陋,以至于使用简单的程序循环来做这一点会更好 .

    我只是使用 ^[A-Za-z0-9][A-Za-z0-9 \.\-_]*[A-Za-z0-9]$ 之类的东西(如果你的正则表达式引擎更高级,那么等同于 ::alnum:: ),然后检查循环中的每个字符以确保下一个字符不相同 .

    通过程序化,您可以在某种程度上检查您可能想要的所有其他规则,而无需诉诸我称之为“正则表达式体操”,例如:

    • 不允许包含您的名字或姓氏 .

    • 不超过两个连续数字 .

    等等 .

  • 1

    所以看起来你希望你的用户名有一个“单词”部分(字母或数字的序列),穿插一些“分隔符”部分 .

    正则表达式看起来像这样:

    ^[a-z0-9]+(?:[ _.-][a-z0-9]+)*$
    

    这是一个原理图分类:

    _____sep-word…____
              /                  \
    ^[a-z0-9]+(?:[ _.-][a-z0-9]+)*$             i.e. "word ( sep word )*"
    |\_______/   \____/\_______/  |
    | "word"     "sep"   "word"   |
    |                             |
    from beginning of string...   till the end of string
    

    所以基本上我们想要匹配 wordword-sep-wordword-sep-word-sep-word 等 .

    • 中间没有 word 没有 word

    • 第一个和最后一个字符将始终是 word 的一部分(即不是 sep 字符)

    请注意,对于 [ _.-]- 是最后一个,因此它不是范围定义元字符 . (?:…) 是所谓的非捕获组 . 我们需要括号来重复分组(即 (…)* ),但由于我们不需要捕获,我们可以使用 (?:…)* 代替 .

    要允许大写/各种Unicode字母等,只需展开字符类/根据需要使用更多标志 .

    参考文献

  • 7

    虽然我确信有人会在短期内发布100万行正则表达式来完成你想要的,但我不认为在这种情况下正则表达式是一个很好的解决方案 .

    你为什么不写一个好老式的解析器?只需编写执行你提到的所有内容的正则表达式,但维护和阅读会更容易 .

    特别是,这是棘手的部分:

    它也不应允许上面列出的任何特殊字符连续重复多次

    或者,你可以随时做两者的混合 . 用于其他检查的正则表达式( [a-zA-Z0-9][a-zA-Z0-9 _-\.]*[a-zA-Z0-9] )和用于无重复要求的非正则表达式方法 .

相关问题