【问题标题】:javascripts regex for username, no spacing, no symbol, need to be alphanumeric, no consecutive letters more than 2 in one row用于用户名的 javascript 正则表达式,无空格,无符号,必须是字母数字,连续字母不能超过 2 个
【发布时间】:2021-06-09 03:10:47
【问题描述】:

我正在尝试编写一个正则表达式来验证必须满足以下条件的用户名:

  1. 必须是字母数字,至少包含一个数字
  2. 没有符号或空格(只有字母数字)。
  3. 没有连续的相同字符连续超过两个。
  4. 至少包含 8 个字符。

这是我尝试过的东西

\^(?=.*\d)((.)\2?(?!\2))+.{8,}$\

aaa -> 不匹配。

jjumper13 -> 匹配。

@aabfrff -> 不匹配。

abdirahm1 -> 匹配。

tryand err -> 不匹配。

666abcde -> 不匹配。

bBb123bBb -> 不匹配。

【问题讨论】:

  • 您需要提供您期望的输入类型的示例。
  • 您的规范中的英文存在很多歧义。 “字母数字或至少一个数字”?你的意思是“字母数字和至少一个数字”? “无符号”仅表示字母数字,或者....? “最少字符是一行 8 个”是什么意思?感谢您的澄清。
  • 666 算作“连​​续字母”吗?
  • 您写了(?=.*\d),这是否意味着您打算包含至少一个数字?
  • 666 是也算作连续字母和 (?=.*\d) 是的,至少一个

标签: javascript regex validation


【解决方案1】:

您快到了,您可以使用否定前瞻来使特定模式失败,并记住明确允许的字符 - here's the Regex101 breakdown

const re = /^(?=.*\d)(?!.*(.)\1\1)[a-z\d]{8,}$/i

const controlTests = [
    'abcd0ef', // fail, too few
    'abcdefgh', // fail, no digit
    'abcd0efg', // pass
    'aBcD0eFg', // pass
    'abcd!0ef', // fail, invalid char
    'aAbBcC00', // pass
    'aAbBc000', // fail, too many consecutive (number)
    'aAbBbC00'  // fail, too many consecutive (letter / case-insensitive)
]

const providedTests = [
    'aaa', // fail
    'jjumper13', // pass
    '@aabfrff', // fail
    'abdirahm1', // pass
    'tryand err', // fail
    '666abcde', // fail
    'bBb123bBb' // fail
]

;[].concat(controlTests, providedTests)
    .forEach(input => console.log(`"${input}"`, re.test(input)))

【讨论】:

    【解决方案2】:

    是一个正则表达式吗?我怀疑将其作为几个单独的规则来维护会更容易(无论如何可能在内部使用正则表达式,但每个规则都应该更简单)。

    【讨论】:

      猜你喜欢
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多