将IRC频道与正则表达式匹配(RFC 2811-2813)

时间:2012-02-24 02:19:17

标签: regex irc rfc

我知道这个问题已经answered in accordance with RFC 1459。但是如何根据RFC 2811-2813使用正则表达式匹配通道?

RFC 2811声明:

  

频道名称是字符串(以'&','#','+'或'!'开头   字符长度最多为五十(50)个字符。频道名称是   不区分大小写。

     

除了要求第一个字符是其中之一   '&','#','+'或'!' (以下称为“频道前缀”)。唯一的   对通道名称的限制是它不包含任何空格   (''),一个控件G(^ G或ASCII 7),一个逗号(',',用作一个   按协议列出项目分隔符)。另外,冒号(':')用作   通道掩码的分隔符。通道名称的确切语法   在“IRC服务器协议”[IRC-SERVER]中定义。

并补充说,RFC 2812声明:

channel    =  ( "#" / "+" / ( "!" channelid ) / "&" ) chanstring
              [ ":" chanstring ]
chanstring =  %x01-07 / %x08-09 / %x0B-0C / %x0E-1F / %x21-2B
chanstring =/ %x2D-39 / %x3B-FF
                ; any octet except NUL, BELL, CR, LF, " ", "," and ":"
channelid  = 5( %x41-5A / digit )   ; 5( A-Z / 0-9 )

2 个答案:

答案 0 :(得分:2)

为了向您展示如何创建复合正则表达式,我将做一个简化的示例。

假设频道名称最多可包含20个字符,仅限小写字母。与此匹配的正则表达式可能是:

[#&][a-z]{1,20}

#&,后跟1到20个字母。由于channelid不遵循相同的模式,因此正则表达式可能是:

![A-Z0-9]{5}

!后跟5个大写字母或数字。对于与这两者中的任何一个匹配的完整正则表达式,您将它们与(...|...)组合,如下所示:

([#&][a-z]{1,20}|![A-Z0-9]{5})

然后,您可以放入稍微复杂的正则表达式,以获得您想要匹配的确切频道名称模式。

答案 1 :(得分:0)

由RFC2812定义(如果我没有记错),除了它不处理最大长度(50字节), 它是一个python正则表达式,它很快就制作好了,但应该正常工作......:

^(((![A-Z0-9]{5})|([#+&][^\x00\x07\r\n ,:]+))(:[^\x00\x07\r\n ,:]+)?)$

您可以看到正则表达式逻辑here

HTH ..