fix(monitor): 修复群聊拆分正则误匹配邮箱导致消息丢失

问题:OCR输出中包含邮箱地址如"youpaishidifu@qq.com",原正则
 会匹配"youpaishidifu@"作为分隔符,
导致群聊拆分只保留"qq.com",消息内容完全丢失。

根因:
1. \s不匹配换行符,导致含换行的匹配失败
2. 无邮箱格式排除机制,@后面有.时仍被误匹配

修复:
- 使用显式空白字符列表 (?=[\n|\t| |\t|,|:]) 替代 \s
- 添加负向前瞻 (?@(?![^@]*\.)) 排除@后面含.的邮箱格式
- 两条款分离:空白/标点匹配 + @非邮箱匹配

测试验证:
✓ 换行+@格式正确拆分
✓ 逗号/空格分隔正确拆分
✓ @直接粘连正确拆分
✓ 邮箱地址不被误匹配
✓ 最新消息内容完整保留
This commit is contained in:
youpaishidifu
2026-08-16 12:52:20 +08:00
parent 5dfc89dd08
commit c06c7df065
+9 -2
View File
@@ -4907,12 +4907,19 @@ class MessageMonitor:
# 模式1: [头衔]用户名 后跟逗号/冒号/@(QQ群头衔格式)
_mid_qq_title = re.compile(r'[\[【][^】\]]+[】\]]\s*(?:[A-Za-z0-9_\u4e00-\u9fff]{2,30})\s*[,,::@]')
# 模式2: 已知裸昵称 后跟逗号/冒号/@(无头衔格式)
# ⭐ 2026-08-13 扩展:增加@匹配,支持"昵称@其他用户"式拼接
# ⭐ 2026-08-16 修复:@后面不能是邮箱格式(排除youpaishidifu@qq.com误匹配)
# 原正则 `_mid_bare_nick = re.compile(r'(?:' + '|'.join(_escaped) + r')\s*[,,::@]')`
# 会匹配 "youpaishidifu@" → 导致群聊拆分只保留 "qq.com",消息内容丢失
# 新正则:使用前瞻 (?=[\n|\t|,|:]) 匹配空白/标点,或使用 (?=@(?![^@]*\.)) 匹配@但排除邮箱
_mid_bare_nick = None
if nicknames:
# 构造已知昵称的转义正则
_escaped = [re.escape(n) for n in nicknames]
_mid_bare_nick = re.compile(r'(?:' + '|'.join(_escaped) + r')\s*[,,::@]')
# 关键改进:显式列出空白字符(\n|\t| )而非\s(\s不匹配换行),并排除邮箱格式
_mid_bare_nick = re.compile(
rf'(?:' + '|'.join(_escaped) + r')(?=\n| |\t|,|:)|'
rf'(?:' + '|'.join(_escaped) + r')(?=@(?![^@]*\\.))'
)
# 找到最后一个分隔符位置,截取其后的文本(最新消息)
last_sep_end = -1