2009-08-29 3 views
3

На данный момент я использую регулярное выражение:Что такое регулярное выражение для проверки идентификатора jabber?

^\A([a-z0-9\.\-_\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z$ 

Я думаю, что это не очень хорошо. Итак, каково лучшее регулярное выражение, которое вы видели или видели для проверки джидов?

Для справки, Section 3 of the XMPP core standard определяет JID в дополненной Backus-Наура, как

jid    = [ node "@" ] domain [ "/" resource ] 
domain   = fqdn/address-literal 
fqdn   = (sub-domain 1*("." sub-domain)) 
sub-domain  = (internationalized domain label) 
address-literal = IPv4address/IPv6address 
+2

Было бы полезно, если бы вы предоставили правила, которые составляют юридический идентификатор jabber. – Pinochle

+0

ire_and_curses уже исправил мой недосмотр, спасибо. –

+1

Я не думаю, что вы понимаете, сколько вы спрашиваете. Эта задача очень похожа на проверку адреса электронной почты, который очень, очень сложный и не очень подходит для регулярных выражений. Проверьте это: http://www.regular-expressions.info/email.html –

ответ

5

Ваше регулярное выражение неверно, по крайней мере в следующем пункты:

  1. Для этого требуется, чтобы джип содержал «@», ты gh jids без «@» также может быть действительным.
  2. Он не проверяет максимальную длину (но ссылку вы предоставили говорит «Каждая допустимая порция JID НЕ ДОЛЖЕН быть больше 1023 байт»)

Я думаю, имея один огромный регулярное выражение является неправильный путь. Вам лучше написать еще какой-нибудь код, разбив jid на более мелкие части (домен, узел, ресурс), а затем проверить каждую из этих частей. Это было бы лучше с нескольких точек:

  • простого тестирование (вы можете модульное тестирование каждое из частей независимо друг от друга)
  • лучше производительность
  • проще код
  • повторного использования
  • и т.д.
+0

Спасибо за подсказку. –

7

Попробуйте следующее:

^(?:([^@/<>'\"]+)@)?([^@/<>'\"]+)(?:/([^<>'\"]*))?$ 

Это не довольно правильно, так как есть много вещей, которые соответствуют ему, которые недействительны JID, особенно в части имени домена. Однако он должен разрешать и анализировать все действительные JID, причем группа 1 является узлом, а группа 2 является доменом, а группа 3 - ресурсом.


данных испытаний:

foo     (None, 'foo', None) 
[email protected]  ('foo', 'example.com', None) 
[email protected]/bar ('foo', 'example.com', 'bar') 
example.com/bar  (None, 'example.com', 'bar') 
example.com/[email protected] (None, 'example.com', '[email protected]') 
example.com/bar/baz (None, 'example.com', 'bar/baz') 
bä[email protected]ämple.com/bäz ('bär', 'exämple.com', 'bäz') 

Кроме: если вы не знакомы с конструкцией (:), это набор скобок, что не добавляет группу к вывод.

Смежные вопросы