我知道这个问题已经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 )
答案 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 ..