У меня есть следующий код для проверки строки формата 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
Есть идеи?
Ага. Все входные данные после sip: совпадают с ([^:@]*), поскольку предыдущий ? делает @ необязательным.
Дополнительные примеры, которые могут помочь при поиске по тегу: stackoverflow.com/questions/tagged/sip+regex
Вы вообще используете какие-либо другие формы для глотка ури? (см. несколько примеров: stackoverflow.com/questions/25516948/…) например, адреса ipv6, порты, строки запроса и т. д. Вам просто нужны @domain и @ip_address и ничего больше?
да, больше не нужно, спасибо за помощь!
Uri sip:4563214567example.com - действительный URI. Пользовательская часть не является обязательной.
действительный SIP URI *. И не забывайте, что у вас может быть sip:user:123;param=value1;param2=value2@domain в качестве SIP URI




Думаю, таким способом удобнее проверять действующий 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?
@ Хулио, это действительный IP-адрес, вы можете проверить его везде
Разве это не должно быть 0.0.0.0?
@ Хулио технически проблем нет! Если где-то или какой-то механизм, который вызывает проблему, существует, сообщите мне!
хорошо, просто проверяю! Я поддержал твою. Я полагаю, вы должны добавить "глотки?" хотя. Кажется, это часть исходного регулярного выражения OP.
спасибо за ответы, когда я пробую ваше регулярное выражение в своей Java IDE, я получаю сообщение «Недопустимая escape-последовательность (допустимые - \ b \ t \ n \ f \ r \" \ '\\) », это не так принять \. escape
Это полностью соответствует нет RFC-3261 для SIP URI.
@snr Если кто-то еще ответит на этот вопрос в будущем, потому что он называется «Проверка SIP URI в Java» и ожидает использовать этот код для проверки SIP URI, его ждет действительно неприятный сюрприз. Ответы предназначены не только для OP, и он в любом случае ничего не указал об этих SIP URI, которые по умолчанию соответствуют RFC-определению SIP URI.
Поэтому я просто давал понять любому будущему читателю, что этот ответ никогда не следует использовать для проверки любого обычного RFC-3261 SIP URI.
Ваш ответ полезен как песок. И удачи в исправлении его в соответствии с RFC-3261.
@ Pierre-LucPineault, возьмите это и, пожалуйста, не комментируйте -> github.com/behrad/opxiCallManager/blob/master/src/java/com/…
Ваше регулярное выражение не требует использования
@в любом месте строки.