【问题标题】:Match IRC channel with regular expression (RFCs 2811-2813)将 IRC 频道与正则表达式匹配 (RFCs 2811-2813)
【发布时间】:2012-03-14 12:46:04
【问题描述】:

我知道这个问题是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 )

【问题讨论】:

  • 所以给出答案/([#&][^\x07\x2C\s]{,200})/(来自您的链接问题),您将如何修改它以匹配您的新规范?
  • @GregHewgill 这是正确的。真正让我感到困惑的是channelid 卡在中间。
  • 谢谢,这有助于澄清您真正要问的问题。

标签: regex irc rfc


【解决方案1】:

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

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

你可以可视化正则表达式逻辑here

HTH..

【讨论】:

    【解决方案2】:

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

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

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

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

    ![A-Z0-9]{5}
    

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

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

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

    【讨论】:

    • 所以,例如,我会写一些类似于([#&+][A-Za-z0-9]{1,49}|![A-Z0-5]{5}[A-Za-z0-9]{1,44}) 的内容,以仅匹配长度不超过 50 的字母数字通道(使用 RFC)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多