2010-05-12 47 views
12

Tôi đang cố gắng viết cụm từ thông dụng chỉ định văn bản đó phải bắt đầu bằng chữ cái, mỗi ký tự phải là chữ cái, số hoặc dấu gạch dưới, không nên có 2 dấu gạch dưới trong một hàng và nó sẽ kết thúc bằng một chữ cái hoặc số. Tại thời điểm này, điều duy nhất tôi có là ^[a-zA-Z]\w[a-zA-Z1-9_] nhưng điều này dường như không hoạt động đúng vì nó chỉ bao giờ khớp với 3 ký tự và cho phép gạch dưới lặp đi lặp lại. Tôi cũng không biết cách xác định các yêu cầu cho ký tự cuối cùng.Biểu thức chính quy - bắt đầu và kết thúc bằng một chữ cái, chỉ chấp nhận chữ cái, số và _

+0

gì ngôn ngữ/regex phương ngữ bạn đang sử dụng? –

+0

Tại sao lớp nhân vật cuối cùng của bạn không bao gồm số không? – SilentGhost

+0

Tôi không chắc chắn. Tôi đang thử nghiệm nó trong notepad ++ mặc dù. Đối với không bao gồm số không, đó là một sai lầm. – jreid9001

Trả lời

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

Dưới đây là một giải pháp sử dụng một lookahead tiêu cực (không được hỗ trợ trong tất cả các động cơ regex):

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

Kiểm tra rằng nó hoạt động như mong đợi:

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

nhìn thấy cách các quy tắc là khá phức tạp, tôi 'd đề xuất những điều sau:

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

khớp toàn bộ chuỗi và chụp trung gian e ký tự. Sau đó, với chức năng chuỗi hoặc regex sau:

/__/ 

kiểm tra xem phần đã chụp có hai dấu gạch dưới liên tiếp hay không. Ví dụ bằng Python nó sẽ trông như thế này:

>>> 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

Tôi sẽ đưa một đâm vào nó:

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

Giải thích:

/ 
^   # 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 

Các tổ chức phi chụp chăm sóc a) không cho phép hai số _ (nó buộc ít nhất một chữ cái hoặc số cho mỗi nhóm) và b) chỉ cho phép char cuối cùng là một chữ cái hoặc số.

Một số chuỗi thử nghiệm:

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

Điều này hữu ích hơn câu trả lời được chấp nhận vì nó giải thích ý nghĩa của từng ký tự nhóm/ký tự. Cảm ơn các chi tiết như regex thường là ngôn ngữ ngoài hành tinh. –

Các vấn đề liên quan