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