我正在寻找一些可以用来检查有效用户名的正则表达式代码。
我希望用户名包含字母(大写和小写),数字,空格,下划线,短划线和点,但用户名必须以字母或数字开头和结尾。
理想情况下,它也不应允许上面列出的任何特殊字符连续重复多次,即它们可以根据需要包含任意数量的空格/点/短划线/下划线,但必须至少他们之间有一个数字或字母。
我也有兴趣了解您是否认为这是一个很好的用户名系统?我已经看过一些可以做到这一点的正则表达式,但它们似乎都没有允许空格,我希望用户名中有一些空格。
谢谢:)
答案 0 :(得分:7)
所以看起来你希望你的用户名有一个“单词”部分(字母或数字序列),散布着一些“分隔符”部分。
正则表达式看起来像这样:
^[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
基本上我们希望匹配word
,word-sep-word
,word-sep-word-sep-word
等内容。
sep
的连续word
word
的一部分(即不是sep
字符)请注意,对于[ _.-]
,-
是最后一个,因此它不是范围定义元字符。 (?:…)
是所谓的非捕获组。我们需要括号来进行重复分组(即(…)*
),但由于我们不需要捕获,我们可以使用(?:…)*
代替。
要允许使用大写/各种Unicode字母等,只需展开字符类/根据需要使用更多标记。
答案 1 :(得分:2)
虽然我确信有人会在短期内发布100万行正则表达式来完全按照你的意愿行事,但我不认为在这种情况下正则表达式是一个很好的解决方案。
你为什么不写一个好的老式解析器?只要编写完成你所提到的所有内容的正则表达式就可以了,但维护和阅读会更容易。
特别是,这是棘手的部分:
它也不应该允许任何 上面列出的特殊字符 不止一次重复 继承
或者你可以随时做两者的混合。用于其他检查的正则表达式([a-zA-Z0-9][a-zA-Z0-9 _-\.]*[a-zA-Z0-9]
)和用于无重复要求的非正则表达式方法。
答案 2 :(得分:1)
您不必为所有内容使用正则表达式。我发现像“没有两个连续的字符”这样的要求通常会使正则表达式变得如此丑陋以至于使用简单的程序循环来做这一点会更好。
如果您的正则表达式引擎更高级,我只会使用类似^[A-Za-z0-9][A-Za-z0-9 \.\-_]*[A-Za-z0-9]$
(或类似::alnum::
之类的东西),然后检查循环中的每个字符以确保下一个字符不是'同样的。
通过程序性的方式,您可以在某种程度上检查您可能想要的所有其他规则,而无需诉诸我称之为“正则表达式体操”,例如:
等等。