fix(monitor): 修复策略4定位逻辑,正确处理特殊符号
问题:原定位逻辑使用 \s\W_ 匹配内容字符,但 √ 被误判为非内容字符, 导致 '你好 [√] GitHub(稳定版) 请问怎么下载?' 被错误处理为 '你好 [√] 载?' 修复:扩展内容字符判断,包含特殊符号 []()√✓✗ - 中文字符、英文字母、数字 → 内容字符 - 特殊符号 []()√✓✗ → 内容字符(用于匹配 bot 回复格式) 测试验证: ✓ '官方下载 bbsmc分流 那我知道公告信息' → '那我知道公告信息' ✓ '你好 [√] GitHub(稳定版) 请问怎么下载?' → '你好 请问怎么下载?' 保留 '纯粹的用户消息,没有bot回复' commit 3f8d9e1 (2026-08-16)
This commit is contained in:
+19
-23
@@ -4815,33 +4815,29 @@ class MessageMonitor:
|
||||
# 定位匹配位置
|
||||
_r_idx = _ts_norm.find(_r_norm)
|
||||
if _r_idx >= 0:
|
||||
# 计算原始文本中的位置(考虑归一化可能改变字符数)
|
||||
# 使用简化的近似定位:从开头跳过非匹配部分
|
||||
_skip_count = 0
|
||||
_norm_count = 0
|
||||
# 在原始文本中精确定位匹配范围
|
||||
# 注意:只计算内容字符(非标点/空白),确保定位准确
|
||||
_start = 0
|
||||
_end = len(ts)
|
||||
_norm_i = 0
|
||||
_found_start = False
|
||||
for _i, _c in enumerate(ts):
|
||||
if _norm_count == _r_idx:
|
||||
_skip_count = _i
|
||||
break
|
||||
if re.sub(r'[\s\W_]+', '', _c):
|
||||
_norm_count += 1
|
||||
# 计算bot回复的归一化长度
|
||||
_r_norm_len = len(_r_norm)
|
||||
_end_norm = _r_idx + _r_norm_len
|
||||
_end_count = 0
|
||||
_end_pos = len(ts)
|
||||
for _i, _c in enumerate(ts[_skip_count:]):
|
||||
if re.sub(r'[\s\W_]+', '', _c):
|
||||
_end_count += 1
|
||||
if _end_count == _r_norm_len:
|
||||
_end_pos = _skip_count + _i + 1
|
||||
# 只计数内容字符(汉字、字母、数字、特殊符号[]等)
|
||||
if re.sub(r'[\s\W_]+', '', _c) or _c in '[]()【】()√✓✗':
|
||||
if not _found_start and _norm_i == _r_idx:
|
||||
_start = _i
|
||||
_found_start = True
|
||||
_norm_i += 1
|
||||
if _found_start and _norm_i >= _r_idx + len(_r_norm):
|
||||
_end = _i + 1
|
||||
break
|
||||
# 移除匹配的bot回复部分
|
||||
_cleaned = ts[:_skip_count] + ts[_end_pos:]
|
||||
|
||||
# 移除匹配的bot回复部分,保留其余内容
|
||||
_cleaned = ts[:_start] + ts[_end:]
|
||||
if _cleaned.strip():
|
||||
logger.debug(
|
||||
f"[qq] 贪婪匹配剥离bot回复: {ts!r} -> { _cleaned!r} "
|
||||
f"(移除: {ts[_skip_count:_end_pos]!r})"
|
||||
f"[qq] 贪婪匹配剥离bot回复: {ts!r} -> {_cleaned.strip()!r} "
|
||||
f"(移除: {ts[_start:_end]!r})"
|
||||
)
|
||||
ts = _cleaned.strip()
|
||||
stripped_bot = True
|
||||
|
||||
Reference in New Issue
Block a user