土拨鼠日志:一个字符类漏了两个字,状态灯就错报了一整天
今天一整天的活,有一半是围着「一句话该不该被认出」打转。最有意思的是,我们被同一个坑绊倒了两次,而且两次的表现一模一样:该被认出来的话,系统当成没看见。这个坑小到只有一个方括号,大到一个状态灯错报了一整天。
一、错的就是这一行:[您你] 只认一个字
事情从一句看起来无比正常的正则说起。我们想判断一段回复里有没有「等你拍板」的收尾,比如「要您做的」「要你做的」,于是写:
/要[您你]做的/
直觉上,方括号里放「您你」,意思是「您」或「你」都行。但实际运行起来,主人明明写的是「要主人做的」,这串却返回 false——漏判了。
原因很朴素:方括号是「单字符类」,它只匹配一个字符。放了「您」「你」,它就能匹配「您」、能匹配「你」,偏偏匹配不了「主人」这两个字。主人两个字往那一塞,整个正则不命中,后面的兜底逻辑全都不跑。
二、一次漏判,能错报到什么程度
第一次栽这个跟头,是在侧栏状态灯上:一条「等主人确认」的收尾,灯却亮了紫色「跑命令中」。主人一眼就看出不对——明摆着在等他回话,界面却显示 AI 还在干活。第二次,是结案判定:一条「主人接下来要做的:……让 lanlan 补续」的结案汇报,本该盖绿「已汇报结案」,结果掉成了橙色「跑命令中」。
两处现象一致:本质正确、判定错误的「语言理解错位」。它不是把好的判成坏的,而是根本没认出来,让一句关键话从所有逻辑里漏过去。
三、怎么改:用分支,别用字符类
修法一句话就能说清:把单字符类换成多选分支。
/要(?:您|你|主人)做的/
多选分支里的每一项是「一整个可选串」,所以「主人」两个字能作为一个整体被匹配。改完之后,我们拿真实写法逐条验证了七种:
- 主人接下来要做的、要您做的、要你做的、要主人做的、要做的、主人要做的事……全部命中;
- 旧写法漏掉的那几种(「主人」「要做的」这种少主语的简写)也都不再漏。
顺带一提,这次还叠加了另一个细节:收尾措辞经常在变(有时是「要做的」,有时是「接下来要做的」),所以正则要留出「主人」「接下来」这种可有可无的片段,用它(?:...)? 形式表示可省,而不是把每一种原文都硬写死。
四、把教训升级成护栏,而不是再记一条备忘
同一个坑栽第二次,说明光「记住」没用。我们直接把它升级成一条硬规矩:
- 凡是要判断「等主人 / 要您做 / 结案收尾」这类多字表述,一律用多选分支 (?:您|你|主人)?,禁止用 [您你] 这种单字符类;
- 改之前,先拿真实会出现的几种原文跑一遍正则,确认命中,而不是凭想象;
- 凡是「该认出来的话」,测试要覆盖三组:该响的、不该响的、边界长度(像两个字的「主人」、三个字的「要做的」,正是最容易被漏的那一类)。
这其实是一条通用经验:字符类适合「单个字里的不同选择」,不适合「多字词组」。要匹配「您 / 你 / 主人」这种有长有短的说法,只能上分支。下一次再写「要[XX]做的」,先停下来想想方括号里是不是塞了超过一个字。
五、这套东西在土拨鼠里什么样
说点能直接对号入座的:
- 会话收尾是不是真在等你拍板,会直接反映到侧栏状态灯上——该是「等待确认」时,就不会再错亮成「跑命令中」;
- 结案汇报会被可靠地识别成「已汇报结案」,你不必再反复确认「它到底结束了没有」;
- 这类「看起来对、实际上漏判」的坑,我们的做法是让它变成脚本里的硬校验,而不是靠下一次记性。
如果你也在用 AI 处理「需要你拍板」的多步任务,先看看 功能页 里关于会话状态与长任务的部分;想算一笔账,定价页 有按量对照;想直接上手,就 下载 装一个,拿一件真事跑一遍。
六、一个 30 秒自查
下次要判断一句「等待 / 结案 / 确认」的话,先问自己三句:
- 用来匹配的正则里,方括号
[]里面是不是塞了不止一个字(比如「您你」)? - 要匹配的说法里,有没有「主人」这种两个字、甚至「要做的」这种少主语的简写?
- 改完有没有拿真实文本跑一遍,而不是只看正则「长得对」?
三个问题里中一个,就先把字符类换成多选分支。正则的坑通常不在它有多难,而在它悄悄漏字而你还看不出它错了。
土拨鼠 Marmot