4

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

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

我认为这不是很好。那么,您拥有或见过的用于验证 jid 的最佳正则表达式是什么?

作为参考,XMPP 核心标准的第 3 节将增强巴科斯-瑙尔形式的 JID 定义为

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

3 回答 3

7

试试这个:

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

不太对,因为有很多与之匹配的东西不是有效的 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')

另外:如果您不熟悉构造 (?:),它是一组不向输出添加组的括号。

于 2009-09-10T16:04:23.293 回答
6

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

  1. 它要求 jid 包含“@”,尽管没有“@”的 jid 也可能有效。
  2. 它不检查最大长度(但您提供的链接显示“JID 的每个允许部分的长度不得超过 1023 个字节”)

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

  • 更容易的测试(您可以独立地对每个部分进行单元测试)
  • 更好的性能
  • 更简单的代码
  • 可重用性
  • 等等
于 2009-08-31T11:36:48.700 回答
0

通过快速搜索,请参阅:

http://jdconley.com/blog/archive/2007/03/13/validating-jabberid-nodes-xmppsoapbox-user-names.aspx

于 2009-08-29T15:08:40.133 回答