如何正确匹配 IRC 上的私人消息?

Posted

技术标签:

【中文标题】如何正确匹配 IRC 上的私人消息?【英文标题】:How can I properly match a private message on IRC? 【发布时间】:2016-06-21 17:15:56 【问题描述】:

我正在制作一个 irc 库,但我似乎无法仅匹配私人消息,它也匹配版本字符串。

正则表达式

:(?P<from>.*?)!\S+\sPRIVMSG\s(?P<to>.*?)\s:(?P<msg>.+)

版本匹配

VERSION_STRING: :AkaneSenri1!~AkaneSenr@72A6C9FC.264941B0.A6596FAF.IP PRIVMSG AkaneSenri1 :VERSION
MATCHED: AkaneSenri1', u'AkaneSenri1', u'\x01VERSION\x01
PRIVATE_MESSAGE_STRING: :AkaneSenri1!~AkaneSenr@72A6C9FC.264941B0.A6596FAF.IP PRIVMSG AkaneSenri1 :T
MATCHED: (u'AkaneSenri1', u'AkaneSenri1', u'T') # is what I want

我得到的是服务器在您连接时发送的版本字符串。 我需要的是,当用户向机器人发送 PM 时。 (昵称/味精)

【问题讨论】:

你能告诉我们你得到了什么以及你期望什么? 可能是:(?P&lt;from&gt;.*?)!\S+\sPRIVMSG\s(?P&lt;to&gt;.*?) :(?!VERSION$)(?P&lt;msg&gt;.+)? (注意我使用re.M 修饰符$ 来匹配行尾,而不是字符串) 它似乎仍然与版本字符串匹配 您必须使用“m”(多行匹配)- Wiktor 的正则表达式似乎适合您的输入。 :(?P&lt;from&gt;.*?)!\S+\sPRIVMSG\s(?P&lt;to&gt;.*?) :(?!VERSION)(?P&lt;msg&gt;.+)? 请定义一个版本字符串。 【参考方案1】:
:(?P<from>.*?)!\S+\sPRIVMSG\s(?P<to>.*?)\s+:(?!VERSION)(?P<msg>.*)$

它正在寻找 : not followed by VERSION 并带有负前瞻 (?!...)

在此处查看:https://regex101.com/r/sQ7eS6/2(单击左侧的单元测试位,然后运行两个测试。或者将您的行粘贴到主要位)

【讨论】:

pastebin.com/raw/sb5SqVxJ 只需注释掉 import errors 和所有的 raise 语句,它就会运行。它仍然是版本。 @MichaelBorgfield 您不能粘贴导致问题的示例字符串,但您可以与全世界分享您的用户名和密码?嗯。 我发布了服务器发送的确切消息,我还提供了完整的库,以便您查看。您想要完整的日志吗? 我不知道为什么这不起作用,我确实使用了一个类似于您使用的网站。我得到了一个肯定的匹配,但无论出于何种原因,它在应用到 lib 时似乎都不起作用。

以上是关于如何正确匹配 IRC 上的私人消息?的主要内容,如果未能解决你的问题,请参考以下文章

在网站上为公共和私人聊天选择哪个更好:IRC 或 Jabber?

C#中的IRC库[关闭]

换行 IRC 协议

如何在 IRC 服务器中发送消息聊天?

如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?

如何从 socket.io-redis 发送私人消息(发射)