Недопустимый диапазон символов рядом с индексом 17

#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