Проверка Sip URI в Java

У меня есть следующий код для проверки строки формата sip: uri:

private final static Pattern SIP_URI_PATTERN = Pattern.compile("^(sip(?:s)?):(?:[^:]*(?::[^@]*)?@)?([^:@]*)(?::([0-9]*))?$", Pattern.CASE_INSENSITIVE);

public static boolean isValidURI(String address){
    if (address == null)
        return false;

    return address != null && address.length() <= 65 && SIP_URI_PATTERN.matcher(address).matches();
}

Я не эксперт, поэтому я думаю, что здесь что-то упустил, когда я отправляю эти строки, он возвращает истинный:

sip: [email protected]

sip: [email protected] -> XX = IP-адрес

Когда я отправляю эту строку, она также возвращает true, но должен вернуть false из-за отсутствия @:

sip: 4563214567example.com

Есть идеи?

Ваше регулярное выражение не требует использования @ в любом месте строки.

Wiktor Stribiżew 17.08.2018 14:34

Ага. Все входные данные после sip: совпадают с ([^:@]*), поскольку предыдущий ? делает @ необязательным.

Mike Samuel 17.08.2018 14:54
stackoverflow.com/questions/25516948/… - это тот же вопрос, за исключением Python. Это фантастический пример, поскольку в ответ включены тестовые примеры. Очевидная работа по решению вашего вопроса - это перевод регулярного выражения Python на Java.
Freiheit 17.08.2018 15:07

Дополнительные примеры, которые могут помочь при поиске по тегу: stackoverflow.com/questions/tagged/sip+regex

Freiheit 17.08.2018 15:09

Вы вообще используете какие-либо другие формы для глотка ури? (см. несколько примеров: stackoverflow.com/questions/25516948/…) например, адреса ipv6, порты, строки запроса и т. д. Вам просто нужны @domain и @ip_address и ничего больше?

Julio 17.08.2018 15:20

да, больше не нужно, спасибо за помощь!

Marc El Bichon 17.08.2018 15:32

Uri sip:4563214567example.com - действительный URI. Пользовательская часть не является обязательной.

Pierre-Luc Pineault 20.08.2018 17:47

действительный SIP URI *. И не забывайте, что у вас может быть sip:user:123;param=value1;param2=value2@domain в качестве SIP URI

Pierre-Luc Pineault 20.08.2018 19:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
675
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, таким способом удобнее проверять действующий IP-адрес или домен.

sip:[0-9]*@((\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b)|((([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})))

Демо


В форме Java

private final static Pattern SIP_URI_PATTERN =
            Pattern.compile("sip:[0-9]*@((\\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4}\\b)|((([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\\.[a-zA-Z]{2,3})))",
                    Pattern.CASE_INSENSITIVE);

Что делать, если 000.000.000.000?

Julio 17.08.2018 14:52

@ Хулио, это действительный IP-адрес, вы можете проверить его везде

snr 17.08.2018 14:55

Разве это не должно быть 0.0.0.0?

Julio 17.08.2018 14:57

@ Хулио технически проблем нет! Если где-то или какой-то механизм, который вызывает проблему, существует, сообщите мне!

snr 17.08.2018 14:59

хорошо, просто проверяю! Я поддержал твою. Я полагаю, вы должны добавить "глотки?" хотя. Кажется, это часть исходного регулярного выражения OP.

Julio 17.08.2018 15:07

спасибо за ответы, когда я пробую ваше регулярное выражение в своей Java IDE, я получаю сообщение «Недопустимая escape-последовательность (допустимые - \ b \ t \ n \ f \ r \" \ '\\) », это не так принять \. escape

Marc El Bichon 17.08.2018 15:10

Это полностью соответствует нет RFC-3261 для SIP URI.

Pierre-Luc Pineault 20.08.2018 19:17

@snr Если кто-то еще ответит на этот вопрос в будущем, потому что он называется «Проверка SIP URI в Java» и ожидает использовать этот код для проверки SIP URI, его ждет действительно неприятный сюрприз. Ответы предназначены не только для OP, и он в любом случае ничего не указал об этих SIP URI, которые по умолчанию соответствуют RFC-определению SIP URI.

Pierre-Luc Pineault 20.08.2018 21:39

Поэтому я просто давал понять любому будущему читателю, что этот ответ никогда не следует использовать для проверки любого обычного RFC-3261 SIP URI.

Pierre-Luc Pineault 20.08.2018 21:40

Ваш ответ полезен как песок. И удачи в исправлении его в соответствии с RFC-3261.

Pierre-Luc Pineault 21.08.2018 16:04

@ Pierre-LucPineault, возьмите это и, пожалуйста, не комментируйте -> github.com/behrad/opxiCallManager/blob/master/src/java/com/…

snr 21.08.2018 16:11

Другие вопросы по теме