正则表达式 - 以字母开头和结尾,只接受字母,数字和_

时间:2010-05-12 17:52:56

标签: regex

我正在尝试编写一个正则表达式,指定文本应以字母开头,每个字符应为字母,数字或下划线,连续不应有2个下划线,并且应以字母或数。目前,我唯一拥有的是^[a-zA-Z]\w[a-zA-Z1-9_],但这似乎无法正常工作,因为它只匹配3个字符,并允许重复的下划线。我也不知道如何指定最后一个字符的要求。

4 个答案:

答案 0 :(得分:41)

我会抓住它:

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

说明:

/
 ^           # match beginning of string
 [a-z]       # match a letter for the first char
 (?:         # start non-capture group
   _?          # match 0 or 1 '_'
   [a-z0-9]+   # match a letter or number, 1 or more times
 )*          # end non-capture group, match whole group 0 or more times
 $           # match end of string
/i           # case insensitive flag

非捕获组负责a)不允许两个_(它强制每组至少一个字母或数字)和b)仅允许最后一个字符为字母或数字。

一些测试字符串:

"a": match
"_": fail
"zz": match
"a0": match
"A_": fail
"a0_b": match
"a__b": fail
"a_1_c": match

答案 1 :(得分:10)

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

答案 2 :(得分:4)

这是一个使用负前瞻的解决方案(并非在所有正则表达式引擎中都支持):

^[a-zA-Z](((?!__)[a-zA-Z0-9_])*[a-zA-Z0-9])?$

测试它是否按预期工作:

import re
tests = [
   ('a', True),
   ('_', False),
   ('zz', True),
   ('a0', True),
   ('A_', False),
   ('a0_b', True),
   ('a__b', False),
   ('a_1_c', True),
]

regex = '^[a-zA-Z](((?!__)[a-zA-Z0-9_])*[a-zA-Z0-9])?$'
for test in tests:
   is_match = re.match(regex, test[0]) is not None
   if is_match != test[1]:
       print "fail: "  + test[0]

答案 3 :(得分:0)

了解规则是如何相当复杂的,我建议如下:

/^[a-z](\w*)[a-z0-9]$/i

匹配整个字符串并捕获中间字符。然后使用字符串函数或以下正则表达式:

/__/

检查捕获的部分是否连续有两个下划线。例如在Python中它看起来像这样:

>>> import re
>>> def valid(s):
    match = re.match(r'^[a-z](\w*)[a-z0-9]$', s, re.I)
    if match is not None:
        return match.group(1).count('__') == 0
    return False