仅使用下划线的用户名正则表达式字母数字

时间:2014-01-13 00:12:32

标签: php regex preg-match

我正在尝试为php的preg_match找到一个正则表达式,它允许带下划线的字母数字字符,但是下划线必须在字符之间(不在字符串的开头或结尾),并且每个字符串旁边永远不会有2个下划线其他

示例:

INVALID:

_name
na_me_
na__me

VALID:

na_me
na_m_e

我找到的那个适用于大多数部分,但不能防止重复的下划线:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/

但就像我说的那样,仍然允许像na__me这样的情况。

有人有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:5)

这样做:

(?x)           # enable comments and whitespace to make
               # it understandable.  always always do this.

^              # front anchor

[\pL\pN]       # an alphanumeric

# now begin a repeat group that 
# will go through the end of the string

(?: [\pL\pN]   # then either another alnum
  |            # or else an underbar surrounded
               # by an alnum to either side of it
    (?<= [\pL\pN] )      # must follow an alnum behind it
    _                    # the real underscore
    (?=  [\pL\pN] )      # and must precede an alnum before it
) *            # repeat that whole group 0 or more times

\z             # through the true end of the string

所以你从一个字母数字开始,然后在最后有任意数量的字母数字,将任何实际的下划线限制在实际的字母数字旁边。

答案 1 :(得分:0)

如果您希望REGEX处理特定长度的字符,请使用{}

离。

[a-z]{2,4}

将返回长度为2,3和4的所有小写字母字符串。

在您的情况下,您可以使用{0,1}表示可以接受NO1下划线。

答案 2 :(得分:0)

你的看起来很好。就像这个,它有点短:

/^[a-z](?:_?[a-z0-9])*$/i