fix(monitor): 修复群聊拆分正则误匹配邮箱导致消息丢失
问题:OCR输出中包含邮箱地址如"youpaishidifu@qq.com",原正则 会匹配"youpaishidifu@"作为分隔符, 导致群聊拆分只保留"qq.com",消息内容完全丢失。 根因: 1. \s不匹配换行符,导致含换行的匹配失败 2. 无邮箱格式排除机制,@后面有.时仍被误匹配 修复: - 使用显式空白字符列表 (?=[\n|\t| |\t|,|:]) 替代 \s - 添加负向前瞻 (?@(?![^@]*\.)) 排除@后面含.的邮箱格式 - 两条款分离:空白/标点匹配 + @非邮箱匹配 测试验证: ✓ 换行+@格式正确拆分 ✓ 逗号/空格分隔正确拆分 ✓ @直接粘连正确拆分 ✓ 邮箱地址不被误匹配 ✓ 最新消息内容完整保留
This commit is contained in:
+9
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user