#java #exception
#java #исключение
Вопрос:
Я новичок в Java, и я хотел создать класс проверки ввода, чтобы при вводе значения (будь то int, string или double) он проверял, не содержит ли оно недопустимых символов, и если это так, возвращал false .
Теперь, даже если это, вероятно, отстой и не имеет особого смысла, мне удалось создать код для этого, проблема в том, что он дает мне недопустимый диапазон символов около исключения индекса 17.
Это код:
public class InputChecker {
public InputChecker()
{
}
public boolean checkString(String string)
{
Pattern pattern = Pattern.compile("[1234567890,.-\!'~#\@* %{}<>\[\]|"\_^]");
Matcher matcher = pattern.matcher(string);
return matcher.find();
}
public boolean checkDouble(double theDouble)
{
Pattern pattern = Pattern.compile("[,-!'~#@* %{}<>\[\]|"\_^]");
String sDouble = String.valueOf(theDouble);
Matcher matcher = pattern.matcher(sDouble);
return matcher.find();
}
public boolean checkInt(int theInt)
{
Pattern pattern = Pattern.compile("[,-!'~#@* %{}<>\[\]|"\_^]");
String sInt = String.valueOf(theInt);
Matcher matcher = pattern.matcher(sInt);
return matcher.find();
}
}
Комментарии:
1. Объяснение, данное в вашем вопросе, недостаточно ясно. У вас есть 3 метода, при которых вы получаете исключение?
2. Господи, прости. Я получаю ошибку в методе checkString.
3. почему вы все равно хотите использовать регулярное выражение для этого. Я бы предпочел использовать Integer.valueOf (строка)
4. checkDouble и checkInt не нужны, double или int никогда не будут равны ни одному из значений в вашем списке исключений. Они всегда будут строковыми представлениями чисел.
5. Как я уже сказал, я полный новичок, но я думаю, что проекты — лучший способ учиться. Не могли бы вы объяснить Integer.valueOf(строка)?
Ответ №1:
Каждое регулярное выражение имеет одну и ту же ошибку. Вы определяете классы символов:
[...]
И вы используете -
s в них. Внутри символьного класса -
задает диапазон: все значения между (включительно) значениями ascii двух символов справа и слева.
Похоже, вы действительно хотите иметь -
как часть класса character . В этом случае просто переместите его вперед (то же самое и для других; примечание: я удалил ненужные обратные косые черты):
"[-1234567890,.!'~#@* %{}<>\[\]|"_^]"
Ответ №2:
В вашем checkString
методе используйте Escape-символ для точки \.
, а ?!
вместо !
этого, поскольку точка является специальным символом, а предвидения определяются ?!
.
Поскольку я полностью не понимаю, что вы пытаетесь сделать.
Вы можете использовать \w
для сопоставления String
, содержит ли он один или несколько символов Word.
Комментарии:
1. В принципе, мне нужно проверить, действительны ли символы в «человеческом» имени, поскольку мне это нужно для проверки имен в программе, которая бронирует номер в мотеле, в котором я работаю.
2. Итак, вы хотите проверить, содержит ли имя только алфавиты или нет?
3. Я просто попытался добавить \ . и ?! и это работает! Спасибо!
Ответ №3:
В моем случае было выдано следующее исключение из-за наличия кириллических символов в диапазоне: [а-я]
в моем проекте Spring Boot. Я заменил этот диапазон на p{L}
, и это сработало. Вы можете найти описание здесь: regular-expressions.info/unicode.html