Мне нужно запретить использование цифр, пробелов и разных символов (?, &, %, и т.д.) в строке. Вот так все работает
if(!name.matches("[a-z][A-Z]")) /*...*/
Если записать вот так, не работает
if(name.matches("\\W"))
Пробовал еще несколько вариантов тоже не работало. Вот мне и интересно, что я упускаю? Почему один вариант работает, а другой нет? И еще, можно мне как-то узнать индекс "запрещенного" символа и вывести его? Типо IllegalCharacter: &
String.matches
проверяет удовлетворяет ли строка целиком заданному регулярному выражению.
Т.о. name.matches("[a-z][A-Z]")
вернет true
только если name
удовлетворяет выражению [a-z][A-Z]
, т.е. состоящих из одной строчной буквы (a-z
) и одной прописной (A-Z
). Например, для строк: aB
, zA
. Для всех остальных вернется false
.
Условие же name.matches("\\W")
выполнится только для строк состоящих из одного символа, который не является буквой латинского алфавита или цифрой (\W
). Например для строк: [
, !
, $
.
Если хотите проверить, что в строке содержатся только символы латинского алфавита и цифры воспользуйтесь выражением: \\w+
(эквивалентно [a-zA-Z0-9]+
)
if(name.matches("\\w+")) {
//в строке только цифры и латинские буквы
}
И еще, можно мне как-то узнать индекс "запрещенного" символа и вывести его?
Есть разные способы:
использовать Pattern
Pattern pattern = Pattern.compile("\\W");
Matcher matcher = pattern.matcher(name);
//если найден запрещенный символ
if (matcher.find()) {
//берем первое его вхождение
int index = matcher.start();
} else {
//запрещенных символов нет
}
перебирать символы самому (возможно, код будет легче читать/редактировать)
for (int i = 0; i < name.length(); i++) {
char ch = name.charAt(i);
if (!isValid(ch)) {
int index = i;
}
}
boolean isValid(char ch) {
return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}
использовать String.split
, чтобы разбить строку по запрещенным символам
String[] subs = name.split("\\W", -1);
if (subs.length == 1) {
//запрещенных символов нет
} else if (subs.length > 1) {
//запрещенные символы есть
int index = subs[0].length();
} else {
//пустая строка
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Только начал осваивать libgdx, наскребал несколько статей по созданию меню и застрял на таком моменте, что приложение не запускается("Unfortunately,...
Добрый день, коллегиВопрос следующего характера: имеется многомодульный Java-проект