【发布时间】:2017-07-02 09:41:55
【问题描述】:
在我的 Javascript Angular 应用程序中,我有一个 regex 来验证用户名。
经过大量研究后,我面临的问题是,将 negative lookahead 与包含空格的表达式一起使用是行不通的。
要求
用户名可以由多个字母数字字符串组成,最多用一个空格分隔。边缘处不允许有空格。用户名也应该针对几个被禁止的名字进行过滤。
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")
作品和word admin 是不允许的
3) 合并两者:
(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used")
失败了!并且将允许使用被禁止的词 admin。
预期结果:
两个过滤器都应该起作用,即禁用词列表,以及随之而来的空格过滤器。 你能指出我的表达可能有什么问题吗?
【问题讨论】:
-
您的前瞻失败,因为它需要在您的禁用词之后的字符串结尾。尝试
(?!(?:admin|alfred))仅禁止第一个单词,(?!.*(?:admin|alfred))禁止字符串中的任何位置,或者尝试(?!.*\b(?:admin|alfred)\b)禁止字符串中的任何位置(当它是一个完整的单词时)。 -
这个 SO answer [link]stackoverflow.com/a/5540478/4052207 建议包含单词 anchor $ 的结尾,您的建议的问题是它不遵守多词规则,请尝试使用多个单词用空格分隔会失败。 @SebastianProske
-
看看at this demo。你写的最多用一个空格分割,所以我猜只允许1或2个字串。
-
@WiktorStribiżew 这正是正确的解决方案。除了可以存在多个单词。添加 * 会正确 (/^(?!.*\b(?:alfred|edward)\b)[a-zA-Z\d]+(?: [a-zA-Z\d]+ )*?$/).test("edwards test edward") 请将其发布在答案中,我会将其标记为正确。非常感谢
标签: javascript angularjs regex