Как сопоставить число, состоящее как минимум из 4 уникальных цифр

#regex #mariadb

#регулярное выражение #mariadb

Вопрос:

Мне нужно (к сожалению, это должно быть сделано на уровне базы данных — на самом деле MariaDB) проверить, используя номера регулярных выражений, используя правило, что число должно состоять как минимум из 4 уникальных цифр.

Примеры того, что мне нужно выполнить:

112233441122 в порядке (сделано только из 1,2,3,4)
1234564222134 в порядке (6 разных цифр)
122102111 является плохим (только 3 цифры: 0,1,2)
91511201 в порядке (5 цифр)

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

Комментарии:

1. Не забудьте показать свою попытку

2. Интересная проблема, но, вероятно, гораздо лучше подходит для смешанного подхода — сначала регулярное выражение, которое гарантирует «только цифры», затем преобразует результат в набор уникальных символов и обеспечивает длину> = 4.

3. ^(d)1* (d)(?:1|2)* (d)(?:1|2|3)* d $

4. @SebastianProske: Отличное решение (если кто-то хочет сделать это в одном регулярном выражении) — это должен быть ответ, а не комментарий. Будем надеяться, что механизм регулярных выражений OP (неуказанный, tsk, tsk) может обрабатывать притяжательные кванторы.

5. Кстати, каков фактический вкус регулярных выражений?

Ответ №1:

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

 ^(d)1* (d)(?:1|2)* (d)(?:1|2|3)* d $
  

То же самое можно сделать, используя атомарные группы:

 ^(d)(?>1*)(d)(?>(?:1|2)*)(d)(?>(?:1|2|3)*)d $
  

Комментарии:

1. Если вы избежите чередования, вы значительно повысите производительность ^(d)1* (d)(?>1*2*) (d)(?>1*2*3*) (d)d*$

2. MySQL не поддерживает d или не поддерживает большинство других функций регулярных выражений, упомянутых здесь.

3. @RickJames Ну, это прискорбно. Обратите внимание, что эта информация была значительно добавлена после моего ответа. Не уверен, почему OP принял его тогда.

4. Для использования этого ответа вам понадобится MariaDB 10.0.5 или более поздней версии. (Oracle MySQL еще не реализовал PCRE.)

5. @RickJames: Моя вина. Ни я правильно проверил наличие проблемы, ни мой вопрос не был достаточно точным. Похоже, что PDO на самом деле подключался к MariaDB, и все работает отлично. И я извлек урок из этого вопроса.