验证jabber id的正则表达式是什么?

Ant*_*nov 4 regex validation xmpp

现在我正在使用这个正则表达式:

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

我认为这不是很好.那么你在验证jids时所拥有或已经看过的最佳正则表达式是什么?

作为参考,XMPP核心标准的第3节将Augmented Backus-Naur形式的JID定义为

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

Joe*_*and 7

试试这个:

^(?:([^@/<>'\"]+)@)?([^@/<>'\"]+)(?:/([^<>'\"]*))?$
Run Code Online (Sandbox Code Playgroud)

这不是正确的,因为有很多事情与之相匹配的是无效的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')
Run Code Online (Sandbox Code Playgroud)

另外:如果您不熟悉构造(?:),那么它是一组不向输出添加组的parens.


Ole*_*xiy 6

你的正则表达式至少在以下几点是错误的:

  1. 它需要jid包含'@',尽管没有'@'的jids也可能有效.
  2. 它不检查最大长度(但是你提供的链接说"JID的每个允许部分的长度不得超过1023个字节")

我认为拥有一个巨大的正则表达式是错误的方法.你最好写一些代码,将jid分成更小的部分(域,节点,资源),然后检查每个部分.从多个方面来看会更好:

  • 更容易测试(您可以单独对每个部件进行单元测试)
  • 更好的性能
  • 更简单的代码
  • 可重用性
  • 等等