fix(gui): 修正@提及清理逻辑,防止误删中文昵称

问题:原步骤2正则在匹配@时包含了中文字符范围[A-Za-z0-9_\u4e00-\u9fff],
导致'@问问那个登录插件'被整体匹配并删除,造成消息内容丢失。

修复方案:
1. 步骤2改为只匹配ASCII昵称:@[A-Za-z0-9_]{1,20}(?=\s|$)
   - 原因:OCR残留的中文昵称前缀(如@问问...)不应被步骤2处理
   - 真实@提及格式通常为ASCII用户名后跟空白(如@user123 你好)

2. 步骤4a改为'^@\s*',仅移除开头的孤立@前缀
   - 例:'@问问那个登录插件' -> '问问那个登录插件' ✓
   - 例:'@小明 这个插件' -> '小明 这个插件' ✓
   - 例:'你好@小明 这个插件' -> 保留原样(真实@提及)

commit 9f3c7d2 (2026-08-16)
This commit is contained in:
youpaishidifu
2026-08-16 17:23:13 +08:00
parent bb24d8990b
commit 9c11ac4246
+8 -9
View File
@@ -346,8 +346,10 @@ def _clean_query_for_kb(msg: str) -> str:
t = msg.strip()
# 1. 移除QQ群头衔格式: [头衔]用户名 / 【头衔】用户名
t = re.sub(r'[\[【][^】\]]+[】\]]\s*(?:[A-Za-z0-9_\u4e00-\u9fff]{2,30})\s*[,,]?\s*', '', t)
# 2. 移除@提及: @username (仅后接空白/串尾时移除,防贪吃无空格的问句)
t = re.sub(r'@[A-Za-z0-9_\u4e00-\u9fff]{2,20}(?=\s|$)', '', t)
# 2. 移除@提及: @ASCII昵称 (仅后接空白/串尾时移除)
# ⚠ 注意:不能匹配 @中文 格式(如@问问...),否则会把整个问句误删
# 修复:步骤2只清理ASCII昵称,中文昵称由步骤4a统一处理
t = re.sub(r'@[A-Za-z0-9_]{1,20}(?=\s|$)', '', t)
# 3. 移除时间戳: HH:MM:SS / HH:MM / 日期格式
t = re.sub(r'\d{1,2}[::]\d{2}(?:[::]\d{2})?\s*', '', t)
t = re.sub(r'\d{4}[//\-]\d{1,2}[//\-]\d{1,2}\s*', '', t)
@@ -360,13 +362,10 @@ def _clean_query_for_kb(msg: str) -> str:
t = t.replace(nick, '')
except Exception:
pass
# 4a. 清理孤立@前缀:移除非提及性质的孤立@(如OCR残留的@前缀)
# 真实@提及格式:@用户名 或 @用户名, / @用户名:
# OCR残留格式:@问问... / @用户ABC... (无前缀空格)
# 注意:步骤2的正则 `@[A-Za-z0-9_\u4e00-\u9fff]{2,20}(?=\s|$)`
# 会匹配整个`@用户名`串(含后续中文),导致误删正常消息。
# 修复:先移除开头的孤立@,再执行步骤2的@清理。
t = re.sub(r'^@+', '', t)
# 4a. 清理孤立@前缀:移除OCR残留的@标记(无论后面跟中文还是ASCII)
# 例:@问问... → 问问... / @用户ABC... → 用户ABC...
# 但如果是真实@提及(如@小明 你好),步骤2已处理,这里不再重复
t = re.sub(r'^@\s*', '', t)
# 5. 清理残留标点/空格
t = re.sub(r'[,,、\s]+', ' ', t).strip(',,、 \t')