Я создаю регулярное выражение, чтобы оценить, является ли IP-адрес действительным адресом многоадресной рассылки. Эта проверка происходит в режиме реального времени, пока вы печатаете (если вы вводите недопустимый символ / символ вне диапазона, он не принимается), поэтому я не могу просто сравнить конечный результат с регулярным выражением. Проблема, с которой я сталкиваюсь, заключается в том, что она допускает двойной период после каждой группы чисел (224 .., 224.0 .., 224.0.0 .. все отображаются как действительные).
Код ниже является статическим представлением того, что происходит. Почему-то 224 .. показывается как легальная стоимость. Я протестировал это регулярное выражение онлайн (не в java'ized: ^ 2 (2 [4-9] | 3 \ d) (. (25 [0-5] | 2 [0-4] \ d | 1 \ d) \ d | [1-9] \ d | \ d)) {3} $), он отлично работает и не принимает неверный ввод, который я описываю.
Pattern p = Pattern.compile("^2(2[4-9]|3\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
Matcher m = p.matcher("224..");
if (!m.matches() && !m.hitEnd()) {
System.out.println("Invalid");
} else {
System.out.println("Valid");
}
Кажется, что метод m.hitEnd () оценивается как истинный всякий раз, когда я ввожу 224, что для меня не имеет смысла.
Если кто-то мог бы, пожалуйста, просмотреть это и удостовериться, что я не делаю никакой очевидной ошибки и, возможно, объяснить, почему hitEnd () возвращает true в этом случае, я был бы признателен.
Спасибо всем.