代码之家  ›  专栏  ›  技术社区  ›  ondrobaco

用于检查字符串的regex只包含字母和数字,而不只包含数字

  •  6
  • ondrobaco  · 技术社区  · 16 年前

    我需要一个关于regex的帮助,它检查字符串只包含字母和数字,而不只是数字。

    有效的

    * letters
    * 1wret
    * 0123chars
    * chars0123
    * cha2rs
    

    无效

    * 1324
    * xcvxxc%$#
    * xcv123xxc%$#
    * _012chars
    * _test
    
    10 回复  |  直到 16 年前
        1
  •  33
  •   polygenelubricants    16 年前

    下面是我们将要使用的regex的组件:

    • ^ 和 $ 分别是管柱锚的起点和终点。
    • \d 匹配数字
    • [a-zA-Z] 匹配一封信
    • [a-zA-Z\d] 匹配字母或数字
    • * 是“零或更多”重复

    有了这些,我们现在可以组成我们需要的正则表达式了。( see on rubular.com ):

    ^\d*[a-zA-Z][a-zA-Z\d]*$
    

    下面是模式的解释:

    from the beginning...  till the end
    |                      |
    ^\d*[a-zA-Z][a-zA-Z\d]*$
     \_/\______/\_________/
    

    这三部分是:

    • 也许吧 一些数字作为前缀…
    • 但那绝对是一封信!
    • 然后 也许吧 一些数字和字母作为后缀

    工具书类

        2
  •  6
  •   Gumbo    16 年前

    应该这样做:

    ^[0-9]*[a-zA-Z]+[a-zA-Z0-9]*$
    

    这至少需要一个字符 [a-zA-Z] .

        3
  •  2
  •   Vitalii Fedorenko    16 年前
    [a-z0-9]*[a-z]+[a-z0-9]*
    
        4
  •  2
  •   BoltClock    16 年前

    您也可以使用 ctype_*() 功能:

    var_dump(ctype_alnum('letters') && !ctype_digit('letters'));     // bool(true)
    var_dump(ctype_alnum('0123chars') && !ctype_digit('0123chars')); // bool(true)
    var_dump(ctype_alnum('1324') && !ctype_digit('1324'));           // bool(false)
    var_dump(ctype_alnum('xcvxxc%$#') && !ctype_digit('xcvxxc%$#')); // bool(false)
    

    但是如果您想要一个正则表达式,您可以使用它:

    var_dump(preg_match('/^[a-z0-9]*[a-z]+[a-z0-9]*$/i', $input));
    
        5
  •  1
  •   Piotr Müller    16 年前
    ^([a-zA-Z0-9]*)([a-zA-Z]+)([a-zA-Z0-9]*)$
    
        6
  •  1
  •   pauljwilliams    16 年前

    就个人而言(我讨厌Regex,并且发现它们通常很难维护),我会分两步完成。

    1. 都是字母数字吗?
    2. 是否至少有一封信?
        7
  •  1
  •   Amarghosh    16 年前

    ^(?=.*[a-z])[a-zA-Z0-9]+$

    • (?=.*[a-z]) 正向前看以确保字符串中至少有一个字母(但不使用任何字符-返回后立即放弃匹配的字符(在本例中,只要找到一个字母))。
    • [a-zA-Z0-9]+ 确保字符串只包含字母数字字符。
    • ^ 和 $ 是字符串分隔符的开始和结束。
        8
  •  0
  •   Carl    16 年前
    ^[0-9]*[a-zA-Z]+[0-9a-zA-Z]*$
    

    翻译:从开始,匹配0个或多个数字,然后至少匹配一个字母,然后匹配零个或多个字母或数字,直到结束。

        9
  •  0
  •   Sadat    16 年前
    ([0-9]*[a-zA-Z]+)+
    
        10
  •  -2
  •   Ties    16 年前

    这应该管用 ^([a-zA-Z0-9]*)([a-zA-Z]+)([a-zA-Z0-9]*)$ 编辑sry得到 * 以及 + 搞乱

    推荐文章