Подтвердить что ты не робот

Регулярное выражение - начиная и заканчивая буквой, принимая только буквы, цифры и _

Я пытаюсь написать регулярное выражение, которое указывает, что текст должен начинаться с буквы, каждый символ должен быть буквой, номером или подчеркиванием, не должно быть 2 подчеркивания в строке, и оно должно заканчиваться буквой или номер. На данный момент единственное, что у меня есть, - это ^[a-zA-Z]\w[a-zA-Z1-9_], но это, похоже, не работает должным образом, поскольку оно только когда-либо соответствует 3 символам и позволяет повторять подчеркивания. Я также не знаю, как указать требования для последнего символа.

4b9b3361

Ответ 1

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

Ответ 2

Я возьму на него удар:

/^[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) позволяет только последнему char быть буквой или числом.

Некоторые тестовые строки:

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

Ответ 3

Здесь решение, использующее отрицательный lookahead (не поддерживается во всех машинах с регулярным выражением):

^[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]

Ответ 4

видя, как правила довольно сложны, я бы предложил следующее:

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