#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;
также его можно значительно упростить.