Я кодирую мелочи в 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. Есть ли что-нибудь, что я могу сделать с регулярным выражением, которое я мог бы сделать, чтобы исправить это? Я знаю, что могу сделать это в грубой силе, но для этого я бы скорее использовал эффективное регулярное выражение. Благодарю.
Вы можете использовать это регулярное выражение loookahead:
\b(?:([1-4])(?![1-4]*\1)){1,4}\b
Используйте указатель, чтобы утверждать, что никакая цифра не повторяется:
^(?!.*([1-4]).*\1)[1-4]{0,4}$
1213
? (Нет дубликатов как таковых, но 1 повторяется)