2010-05-12 106 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

相關問題