Как использовать регулярное выражение для проверки наличия дублирующихся символов в строке?

1

Я кодирую мелочи в Java, и у меня все сделано, за исключением проверки одной части ответа пользователя. Поэтому в основном, я буду предлагать пользователю вопрос и возможные ответы, и пользователь ответит на них. Прямо сейчас, я пытаюсь проверить их ответ, прежде чем проверять, правильно ли это, поэтому, если это неправильно, я могу предложить им ввести другой ответ. Правила заключаются в том, что их ответ должен быть строкой от нуля до четырех символов, используя только цифры 1-4, и повторных символов не может быть. Итак, 1234 действителен, 24 действителен, 321 действителен, 589 недействителен, abc недействителен, 111 недействителен, а 1233 является недопустимым. До сих пор я получил все условия, за исключением дубликатов символов. Сначала я использовал

if (answer.matches("^[1-4]{0,4}$")) { // valid check if correct

Это заботится обо всем, кроме дубликатов. Затем я попробовал

if (answer.matches("^1?2?3?4?$")) { // valid check if correct

Это касается дубликатов, если пользователь вводит номер в порядке возрастания, т.е. 123, 234, 24, 12, 2344 и т.д. Единственная проблема заключается в том, что если пользователь вводит что-то вроде 432, он будет считаться недействительным, даже если он следует считать действительным. Я понимаю, почему это не совпадает с моим регулярным выражением, но единственным другим решением, о котором я мог думать, было бы перечисление всех возможных решений, но, очевидно, я не собираюсь вводить 24 условия в оператор if. Есть ли что-нибудь, что я могу сделать с регулярным выражением, которое я мог бы сделать, чтобы исправить это? Я знаю, что могу сделать это в грубой силе, но для этого я бы скорее использовал эффективное регулярное выражение. Благодарю.

Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

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

\b(?:([1-4])(?![1-4]*\1)){1,4}\b

Демо-версия RegEx

  • 1
    Это сработало. Спасибо!
  • 0
    Пожалуйста, рад, что это сработало.
0

Используйте указатель, чтобы утверждать, что никакая цифра не повторяется:

^(?!.*([1-4]).*\1)[1-4]{0,4}$
  • 0
    Я действительно запутался в этом. Когда я использую ваше регулярное выражение в онлайн-тестере регулярных выражений, оно работает именно так, как я хочу. Но в Java это не устраняет дубликаты, как это должно быть. Я делаю что-то не так с кодом для этого? if (answer.matches ("^ (?!. * ([1-4]). * \ 1) [1-4] {0,4} $")) {

Ещё вопросы

Сообщество Overcoder
Наверх
Меню