Регулярное выражение для проверки в слове повторяющейся буквы и предотвращения ввода символа или символа

#java #regex

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

Вопрос:

Я просто пытаюсь написать метод на Java, который будет использовать регулярное выражение для проверки, не содержит ли слово повторяющейся буквы, будь то «AAA» или «Aba» или «aa», и не содержит никаких специальных символов, таких как $, !, amp;, ….

Вот что я пробовал до сих пор.

 public boolean checkWord(String word) {
        Pattern regex = Pattern.compile("([a-zA-Z0-9])\1{1}");
        Matcher match = regex.matcher(word);
        if (match.find()) {
            return true;
        }
            return false;
        }
    }
 

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

1. Я могу представить любое решение regex для этого, имеющее ужасно плохие проблемы с возвратом. Обязательно ли использовать регулярное выражение?

2. Я так и думал. но если есть какой-либо другой возможный метод, я был бы открыт для его использования.

3. Повторите посимвольно, записывая, что текущий был замечен, если не был замечен ранее (например, путем помещения его в набор), и немедленно возвращаясь, если текущий ранее был замечен ранее (например, если он уже есть в наборе), или это «специальный символ».

4. @Pshemo, регулярное выражение проверяет $ ! amp; только, но может разрешать другие специальные символы, в то время как он должен разрешать только строки, содержащие отдельные буквы или цифры. например, Mine14

5. В этом случае просто принимайте символы, которые являются буквами или цифрами. Кажется, это делает то, что вы хотите : word.matches("(?i)(?:([a-z0-9])(?!.*\1)) ") .

Ответ №1:

Вы можете использовать это:

 public boolean checkWord(String word) {
    Pattern regex = Pattern.compile("([a-zA-Z0-9]).*\1|[^a-zA-Z0-9]");
    Matcher match = regex.matcher(word);
    return !match.find();
}
 

Пожалуйста, обратите внимание, что я в основном переключил ваше true и false .

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

1. @Samlz Я отредактировал свой ответ, чтобы сделать метод «разрешающим только строки, содержащие отдельные буквы или цифры».

2. Возможно, вы захотите добавить Pattern.CASE_INSENSITIVE флаг, чтобы также обрабатывать такие случаи, как Aba (где A повторяется как a ).

Ответ №2:

Для альтернативного подхода, вот короткий метод (в Java 9 ), чтобы сделать это без регулярных выражений. Он использует набор для отслеживания символов, которые необходимо отклонить.

Вместо того, чтобы проверять, нужно ли отклонять символ, используя set.contains() then также set.add() позже, я просто вызываю set.add() и использую результат, чтобы определить, был ли символ уже в наборе. Таким образом, поиск в наборе требуется только один раз.

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

 /** Checks if a word contains any specified special characters, or any re-used character */
public static boolean checkWord(String word) {
    final Set<Character> set = new HashSet<>(Arrays.asList('


Ответ №3:

Мне все еще немного непонятно, когда вы хотите, чтобы метод возвращал true / false, но я думаю, что основная идея может быть решена с помощью приведенного ниже кода без регулярных выражений:

     public boolean checkWord(String word) {
        final Set<Character> set = new HashSet<>();
        boolean passed = false;
        //using toLowerCase because `a` should be equal to `A`
        final char[] characters = word.toLowerCase().toCharArray();
        for (char c : characters) {
            //if a special character is found, return false
            if (! Character.isLetterOrDigit(c)) {
                return false;
            }
            
            //if caracter is in the set, it's a re-occurence
            if (set.contains(c)) {
                passed = true; //can't return, must check rest of string for special characters
            }
            //added to check re-occurrence
            set.add(c);
        }

        return passed;
    }
 

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

1. Это неточно в соответствии с тем, что запрашивает OP: check if a word does not contain any repeated letter whether "AAA" or "Aba" or "aa" and does not include any special characters like $, !, amp; также его можно значительно упростить.

, '!', 'amp;'));
return word.chars().anyMatch(i -> !set.add(Character.toLowerCase((char) i)));
}

public static void main(String[] args) {
String[] words = { "AAA", "Aba", "aa", "abcamp;def", "$omething", "exciting!", "abcd", };
for (String word : words) {
System.out.println(checkWord(word) " : " word);
}
}

Ответ №3:

Мне все еще немного непонятно, когда вы хотите, чтобы метод возвращал true / false, но я думаю, что основная идея может быть решена с помощью приведенного ниже кода без регулярных выражений:


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

1. Это неточно в соответствии с тем, что запрашивает OP: check if a word does not contain any repeated letter whether "AAA" or "Aba" or "aa" and does not include any special characters like $, !, amp; также его можно значительно упростить.