【问题标题】:Regex matching digit and letters or only digits正则表达式匹配数字和字母或仅数字
【发布时间】:2021-11-03 18:24:10
【问题描述】:

我一直在尝试编写符合这些条件的正则表达式:

  • 9位以上的字符串
  • 超过 9 个数字和字母的字符串

我不知道如何写我的正则表达式对它说:数字或数字和字母可以匹配,但不能匹配字母。

这些字符串应该匹配:

  • 12345678987654567
  • jhsjd4567hsqdgqsgh456786576567kj
  • 9l8j9n9k0n9n8n

那些字符串不应该匹配:

  • loremipsum
  • a1
  • 12567

到目前为止我的正则表达式:/(?:\w){9,}/

非常感谢:)

【问题讨论】:

  • 此时最好使用编程语言的逻辑
  • (?:\w){9,} 等于 \w{9,} 并且匹配九个或更多数字、字母或下划线/连接符标点符号。如果您需要在单词边界内匹配,您可能希望在开头使用(?=\w{0,8}[0-9]) 之类的前瞻,(?=\w{0,8}[0-9])\w{9,}\b(?=\w{0,8}[0-9])\w{9,}\b。请说明您需要在哪些边界内匹配这些字符串。

标签: regex


【解决方案1】:

我将您的要求解释为:匹配一个超过九个字符的字符串,该字符串仅包含数字或仅包含数字和字母。

const tests = [
  '12345678987654567',
  'jhsjd4567hsqdgqsgh456786576567kj',
  '9l8j9n9k0n9n8n',
  'loremipsum',
  'a1',
  '12567',
];

for (const t of tests) {
  console.log(t.padEnd(35) +
    /^(?=.*\d)[a-z\d]{10,}$/i.test(t)
  )
}

正向前瞻(?=.*\d) 确保字符串中至少有一位数字。

如果您只想匹配小写字母,请删除 i 标志。

【讨论】:

    【解决方案2】:

    使用\w可以同时匹配字母和数字,所以使用(?:\w){9,},可以写成\w{9,}也可以只匹配字母或者只匹配下划线。

    阅读要求,您可以匹配一个字母或一个数字 9 次或更多次,并确保字符串不只包含使用负前瞻(如果支持)的字母。

    如果要匹配9个以上,可以使用{10,}作为量词。

    ^(?![a-zA-Z]+$)[a-zA-Z0-9]{9,}$
    

    模式匹配:

    • ^ 字符串开始
    • (?![a-zA-Z]+$) 负前瞻,不仅断言字符串中的字符 a-z A-Z
    • [a-zA-Z0-9]{9,} 匹配 9 次或更多次字符 a-z A-Z 或数字
    • $字符串结束

    Regex demo

    或者使用单词边界:

    \b(?![a-zA-Z]+\b)[a-zA-Z0-9]{9,}\b
    

    Regex demo

    【讨论】:

      【解决方案3】:

      我相信它应该可以工作

      /([a-z]*[0-9][a-z]*){9,}/
      

      【讨论】:

      • 这与'9l8j9n9k0n9n8n' 不匹配,因为您的正则表达式要求至少有九位数字。此外,问题指出“超过 9”,所以 {9,} 应该是 {10,}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2011-08-29
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多