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