我正在尝试为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这样的情况。
有人有什么想法吗?谢谢!
答案 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}
表示可以接受NO
或1
下划线。
答案 2 :(得分:0)
你的看起来很好。就像这个,它有点短:
/^[a-z](?:_?[a-z0-9])*$/i