【问题标题】:Regex Javascript, negative lookahead with white space正则表达式 Javascript,带空格的负前瞻
【发布时间】: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


【解决方案1】:

你可以考虑使用

/^(?!.*\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 次或多次重复)替换为 ?(1 或 0 次重复)量词 (demo)。

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

模式详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多