2010-05-12 96 views
12

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

+0

您正在使用什么语言/方言正则表达式? – 2010-05-12 18:02:42

+0

为什么你最后一个字符类不包含零? – SilentGhost 2010-05-12 18:20:52

+0

我不确定。尽管如此,我在记事本++中测试它。至于不包括零,这是一个错误。 – jreid9001 2010-05-12 23:08:36

回答

6
^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$ 
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] 
0

看到的规则如何是相当复杂的,我'd建议如下:

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

匹配整串和捕获中介e字符。然后或者用字符串的功能或以下的正则表达式:

/__/ 

检查,如果所捕获的部分具有一排两个下划线。例如在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 
35

我将它取刺:

/^[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 
+0

这比接受的答案更有帮助,因为它解释了每个分组/保留字符的含义。感谢细节,因为正则表达式通常是外来语言。 – 2017-08-17 16:00:33

相关问题