Недавно я столкнулся с головоломкой, чтобы найти регулярное выражение, которое соответствует:
Строки длиной 5 символов, состоящие из строчных букв латинского алфавита в порядке возрастания ASCII.
Допустимые примеры включают:
aaaaa
abcde
xxyyz
ghost
chips
demos
Недопустимые примеры включают:
abCde
xxyyzz
hgost
chps
Мое текущее решение является kludgy. Я использую регулярное выражение:
(?=^[a-z]{5}$)^(a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*)$
который использует не потребляющую группу захвата для утверждения длины строки 5, а затем проверяет, состоит ли строка из строчных букв латинского алфавита в порядке (см. рубрику).
Вместо этого я хотел бы использовать обратные ссылки внутри классов символов. Что-то вроде:
^([a-z])([\1-z])([\2-z])([\3-z])([\4-z])$
Логика решения (см. Rubular) в моей голове состоит в том, чтобы захватить первый символ [a-z], использовать это как обратная ссылка во втором классе символов и так далее. Однако \1
, \2
... в классах символов, по-видимому, относятся к значениям ASCII 1, 2... эффективно совпадающим с любой строкой из четырех или пяти символов.
У меня есть 2 вопроса:
- Могу ли я использовать обратные ссылки в своих классах символов для проверки строк в порядке возрастания?
- Есть ли какое-нибудь менее хакерское решение этой головоломки?
came across a puzzle to find a regular expression
- Обязательно процитируйте эту ссылку, чтобы мы могли посмеяться над загадкой.. - person   schedule 13.07.2017(?{..})
. Если вы думаете, что будете использовать Perl, то это... выполнимо. Кстати, ваше первое регулярное выражение просто отлично. - person   schedule 13.07.2017\pL-z
выдает ошибку построения. Таким образом, ссылка может содержать несколько символов. - person   schedule 13.07.2017demos
включен в недопустимый список? - person anubhava   schedule 14.07.2017^(?=[a-z]{5}$)a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$
- person anubhava   schedule 14.07.2017