Как навести порядок в регулярном выражении? - PullRequest
0 голосов
/ 21 мая 2018

В моем приложении Rails у меня есть это регулярное выражение:

/\A(?:\{(?:YYYY|YY|MM|DD|N{2,6})\}|[A-Za-z_.#-])*\z/

Это соответствует, например, такой строке: {YY}{MM}{DD}{NNNN}

Есть ли способ применить порядок {YY}, {MM}, {DD} и {NN}, так что, например ...

{DD}{MM}{YY}{NNNN}

... не будет действительным?

Чтобы сделать это еще более сложным, между этими элементами также должны быть разрешены буквы, тире и подчеркивания.

Таким образом, эта строка также должна быть действительной:

{YY}-{MM}-{DD}_{NNNN}

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

В настоящее время ваше регулярное выражение соответствует любой последовательности букв, например abcde.Кроме того, вам нужно оставить один символ из [A-Za-z_.#-] установленным между фигурными скобками - опционально.На Ruby> = 1.9 ниже регулярное выражение с вызовами подпрограмм работает хорошо:

\A{YY(?:YY)?}([A-Za-z_.#-]?){MM}\g<1>{DD}\g<1>{N{2,6}}\z

Живая демонстрация

0 голосов
/ 21 мая 2018

Для обеспечения заказа вашему регулярному выражению необходимо убедиться, что заказ используется.В настоящее время вы просто ищете YY, MM и т. Д. По отдельности.Вместо этого вы можете сделать что-то вроде этого:

\A(\{YY(YY)?\}\{MM\}\{DD\}\{N{2,6}\}|[A-Za-z_.#-])*\z

Чтобы разрешить тире или подчеркивание между частями, теперь вы можете легко добавлять их:

\A(\{YY(YY)?\}[-_A-Za-z]*\{MM\}[-_A-Za-z]*\{DD\}[-_A-Za-z]*\{N{2,6}\}|[A-Za-z_.#-])*\z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...