首页 文章

只有letterNumber而不是所有数字

提问于
浏览
4

我知道如何使用正则表达式来验证它是否只是字母数而没有空格:

/^[0-9a-zA-Z]+$/

但是我如何添加到这个正则表达式,使它不能只包含数字,所以例如这是无效的:

08128912382

有任何想法吗?

4 回答

  • 1

    “必须只包含字母和数字,并且至少包含一个字母”等同于“必须包含由数字或字母包围的字母”:

    /^[0-9a-zA-Z]*[a-zA-Z][0-9a-zA-Z]*$/
    

    我想补充一点,这个答案显示了一种可以思考问题的方法,因此编写正则表达式更简单 . 它并不意味着是解决问题的最佳方案 . 我只是把你所拥有的东西给了它一个正确方向的推动 .

    通过几个推动,您最终会得到其他不同的答案(分别由ZER0,Tomalak和OGHaza发布):

    • 您可能会注意到,如果第一组或最后一组中有一个字母,则中间部分会满意 . 换句话说,由于你有中间部分,你不需要在第一个或最后一个部分允许字母(但不是两个!):

    • /^[0-9]*[a-zA-Z][0-9a-zA-Z]*$/ - 一些数字,后跟一个字母,后跟一些更多的数字和字母

    • /^[0-9a-zA-Z]*[a-zA-Z][0-9]*$/ - 相当于你从最后读到的

    • 了解前瞻,你可以断言字符串中至少有一个字母:

    • /^(?=.*[a-z])/ - 匹配包含至少1个字母的任何字符串的开头

    • 或者反过来说,正如你所表达的那样,断言字符串中不仅有数字:

    • /^(?!\d+$)/ - 匹配任何不包含数字的字符串的开头

    第二个和第三个解决方案也应该与您的原始正则表达式结合使用,该正则表达式验证字符串是否只包含您想要的字符(字母和数字)

    我特别喜欢第二种解决方案,我相信迄今为止所有尝试中最快的解决方案 .

  • 7

    预见可以做到:

    /^(?=.*[a-z])[0-9a-z]+$/i
    
  • 5

    我认为最优雅的解决方案是负面的先行,以检查它不仅仅是数字

    /^(?!\d+$)[0-9a-zA-Z]+$/
    

    RegExr Example

  • 2

    所以基本上你需要在字符串中至少有一个字母 . 在这种情况下,您可以检查是否存在一个或多个字母,可能前面有一个或多个数字,可能后跟两个:

    /^[0-9]*[a-z][0-9a-z]*$/i
    

    请注意,如果您针对像 "A" 这样的字符串进行测试,它将返回 true ,因为在这种情况下,所有数字都被视为可选 .

相关问题