繁体   English   中英

正则表达式Javascript,带有空格的否定超前

[英]Regex Javascript, negative lookahead with white space

在我的Javascript angular应用程序中,我有一个正则表达式来验证用户名。

经过大量研究后,我面临的问题是,对包含空格的表达式使用负前瞻是行不通的。

要求

用户名可以由最多由一个空格分开的许多字母数字字符串组成。 边缘处不允许有空格。 用户名也应根据几个禁止的名称进行过滤。

1)

(/^[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used") 

允许一次将字母数字单词分开一个随后的空格,并禁止在边缘保留空格

2)

(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+$/).test("admin")

可行,并且不允许使用单词admin

3)合并:

(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used") 

失败! 并允许使用被禁止的单词admin。

预期结果:

这两个过滤器都可以正常工作,即被禁止的单词列表以及后续的空间过滤器。 您能指出我的表情可能有问题吗?

您可以考虑使用

/^(?!.*\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]+)+$/

正则表达式演示

如果允许使用一个单词的用户名,请用?替换最后的+ (1个或多个重复) ? (1或0个重复)量词( demo )。

如果您在AngularJS中使用它,还请使用ng-trim="false"以确保不允许前导和尾随空格。

图案细节

  • ^ -字符串开头
  • (?!.*\\b(?:admin|alfred)\\b) -零个或多个字符( .* )之后,不能将adminalfred视为整个单词(否则,正则表达式将返回false)
  • [a-zA-Z\\d]+ -1个或更多字母数字
  • (?: -开始非捕获组
    • \\s空格
    • [a-zA-Z\\d]+ -1个或更多字母数字
  • )+ -非捕获组的末端,将重复1次或更多次
  • $ -字符串结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM