Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 验证jabber id的正则表达式是什么?_Regex_Validation_Xmpp - Fatal编程技术网

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

Regex 验证jabber id的正则表达式是什么?,regex,validation,xmpp,Regex,Validation,Xmpp,现在我使用的是这个regexp: ^\A([a-z0-9\.\-_\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z$ 我觉得不太好。那么,您所见过的验证JID的最好的正则表达式是什么 为了便于参考,将扩展的Backus Naur形式的JID定义为 jid = [ node "@" ] domain [ "/" resource ] domain = fqdn / address-literal fqdn =

现在我使用的是这个regexp:

^\A([a-z0-9\.\-_\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z$
我觉得不太好。那么,您所见过的验证JID的最好的正则表达式是什么

为了便于参考,将扩展的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

通过快速搜索,请参见:


您的regexp至少在以下几点上是错误的:

  • 它要求jid包含一个“@”,尽管没有“@”的jid也可能有效
  • 它不会检查最大长度(但您提供的链接说“JID的每个允许部分的长度不得超过1023字节”)
  • 我认为拥有一个巨大的regexp是一个错误的选择。您最好编写更多的代码,将jid分成更小的部分(域、节点、资源),然后检查每个部分。从多个方面来看,这会更好:

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

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


    旁白:如果您不熟悉构造(?:),它是一组不向输出中添加组的参数。

    如果您提供构成合法jabber id的规则,那将很有帮助。ire_和_curses已经修复了我的疏忽,谢谢。我想您还没有意识到您的要求有多高。这个任务非常类似于验证电子邮件地址,这非常非常复杂,不适合正则表达式。检查一下:您的正则表达式的另一个问题是它没有考虑大量在JID中合法但不是a-z0-9的Unicode代码点。
    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')