在我的Javascript角度应用程序中,我有 regex 来验证用户名。
我在进行大量研究后面临的问题是,使用包含空格的表达式否定前瞻是行不通的。
用户名可以由许多字母数字字符串组成,最多可以分隔一个空格。边缘处的空格是不允许的。用户名也应该针对几个被禁止的名称进行过滤。
(/^[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used")
允许字母数字单词一次被一个后续空格拆分,并且不允许边缘处的空格
(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+$/).test("admin")
有效且不允许使用管理员
(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used")
失败!并允许使用禁止的单词admin。
预期两个过滤器都可以工作,即禁止的单词列表,以及随之而来的空间过滤器。 你能指出我的表达可能有什么问题吗?
答案 0 :(得分:2)
您可以考虑使用
/^(?!.*\b(?:admin|alfred)\b)[a-zA-Z\d]+(?:\s[a-zA-Z\d]+)+$/
或更长一点,但更有效(但可读性更低):
/^(?!(?:admin|alfred)\b)[a-zA-Z\d]+(?:\s(?!(?:admin|alfred)\b)[a-zA-Z\d]+)+$/
请参阅regex demo
如果允许使用一个单词用户名,则用+
(1或0次重复)量词(demo)替换最后?
(1次或多次重复)。
如果您在AngularJS中使用它,也可以使用ng-trim="false"
来确保不允许前导和尾随空格。
模式详情:
^
- 字符串开头(?!.*\b(?:admin|alfred)\b)
- 在零个或多个字符(.*
)之后,整个单词不能admin
或alfred
(否则,正则表达式将返回false)< / LI>
[a-zA-Z\d]+
- 一个或多个字母数字(?:
- 开始non-capturing group
\s
- 空白[a-zA-Z\d]+
- 一个或多个字母数字)+
- 将重复一次或多次的非捕获组的结束$
- 字符串结束。