Один из способов сделать это - пропустить его через два регулярных выражения, убедившись, что они совпадают (при условии, что вы хотите использовать регулярные выражения вообще, см. Альтернативу ниже):
^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$
Все остальное (и, фактически, даже это), скорее всего, является просто попыткой проявить смекалку, что обычно является серьезным провалом.
Первое регулярное выражение обеспечивает четное число a
с b
в любом месте микса (до, после и между ними).
Второе схоже, но гарантирует, что нечетное число b
благодаряначиная с a*ba*
.
Далеко лучший способ сделать это - полностью игнорировать регулярные выражения и просто пробежаться по строке следующим образом:
def isValid(s):
set evenA to true
set oddB to false
for c as each character in s:
if c is 'a':
set evenA to not evenA
else if c is 'b':
set oddB to not oddB
else:
return false
return evenA and oddB
Хотя регулярные выражения являются прекрасным инструментом, они не подходят для всего, и они становятся гораздо менее полезными, поскольку их удобочитаемость и удобство обслуживания ухудшаются.
Для чего-то стоитОтвет gex:
(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)
, но если я поймаю кого-нибудь в моей команде на самом деле с помощью такого чудовища, их отправят обратно, чтобы сделать это снова.
Это исходит отбумага от одного Грега Бэкона.См. здесь для фактической внутренней работы.