Regex для соответствия всем перестановкам {1,2,3,4} без повторения

Я реализую следующую проблему в рубине.

Вот шаблон, который я хочу:

1234, 1324, 1432, 1423, 2341 и так далее

т.е. цифры в четырехзначном числе должны быть между [1-4] и должны также быть неповторяющимися.

чтобы заставить Вас понять простым способом, я беру два шаблона цифры, и решение должно быть: 12, 21

т.е. цифры должны быть или 1 или 2 и должны быть неповторяющимися.

Чтобы удостовериться, что они являются неповторяющимися, я хочу использовать 1$ для условия для моей второй цифры, но не работа.

Выручите меня и заранее спасибо.

10
задан Apoorv Saxena 2 November 2018 в 07:43
поделиться

2 ответа

Вы можете использовать это (см. на rubular.com):

^(?=[1-4]{4}$)(?!.*(.).*\1).*$

Первое утверждение гарантирует, что это ^[1-4]{4}$, второе утверждение - это отрицательный lookahead, который гарантирует, что вы не сможете подобрать .*(.).*\1, то есть повторяющийся символ. Первое утверждение "дешевле", поэтому сначала нужно выполнить это утверждение.

Ссылки

Похожие вопросы

22
ответ дан 3 December 2019 в 14:00
поделиться

Просто для прикола, вот еще один вариант:

^(?:1()|2()|3()|4()){4}\1\2\3\4$

По мере того, как потребляется каждый уникальный символ, следующая за ним группа захвата захватывает пустую строку. Обратные ссылки также пытаются подобрать пустые строки, поэтому если одна из них не удалась, это может означать только то, что связанная с ней группа не участвовала в подборе. И это произойдет только в том случае, если строка содержит хотя бы один дубликат.

Такое поведение пустых групп захвата и обратных ссылок официально не поддерживается ни в одном из регексов, так что caveat emptor. Но оно работает в большинстве из них, включая Ruby.

11
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: