Каково регулярное выражение для проверки идентификатора jabber? - PullRequest
3 голосов
/ 29 августа 2009

Пока я использую это регулярное выражение:

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

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

Для справки: Раздел 3 основного стандарта XMPP определяет JID в расширенной форме Бэкуса-Наура как

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

Ответы [ 3 ]

7 голосов
/ 10 сентября 2009

Попробуйте это:

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

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


Данные испытаний:

foo                 (None,  'foo', None)
foo@example.com     ('foo', 'example.com', None)
foo@example.com/bar ('foo', 'example.com', 'bar')
example.com/bar     (None,  'example.com', 'bar')
example.com/bar@baz (None,  'example.com', 'bar@baz')
example.com/bar/baz (None,  'example.com', 'bar/baz')
bär@exämple.com/bäz ('bär', 'exämple.com', 'bäz')

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

5 голосов
/ 31 августа 2009

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

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

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

  • более легкое тестирование (вы можете самостоятельно протестировать каждую из частей)
  • лучшая производительность
  • более простой код
  • 1018 * повторное использование *
  • и т.д.
0 голосов
/ 29 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...