现在我正在使用这个正则表达式:
^\A([a-z0-9\.\-_\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z$
我认为这不是很好。那么你在验证jids时所拥有或已经看过的最佳正则表达式是什么?
作为参考,Section 3 of the XMPP core standard将Augmented Backus-Naur Form中的JID定义为
jid = [ node "@" ] domain [ "/" resource ]
domain = fqdn / address-literal
fqdn = (sub-domain 1*("." sub-domain))
sub-domain = (internationalized domain label)
address-literal = IPv4address / IPv6address
答案 0 :(得分: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')
除此之外:如果您不熟悉构造(?:),那么它是一组不向输出添加组的parens。
答案 1 :(得分:5)
你的正则表达式至少在以下几点是错误的:
我认为拥有一个巨大的正则表达式是错误的方法。你最好写一些代码,将jid分成更小的部分(域,节点,资源),然后检查每个部分。从多个方面来看会更好:
答案 2 :(得分:0)