最新JavaScript matchAll 的游标副本:遍历已到末尾,原正则的位置为什么没动 把exec循环换成matchAll以后,匹配结果已经读到最后,原正则的lastIndex却仍停在一。接着重新调用,又从同一个非零位置开始。这种行为来自matchAll为普通正则创建匹配副本:它保留创建时的起点,遍历推... yunqueblog/ 技术教程/ 2026-10-04/ 3 阅读
Python 正则原子组:普通分组能匹配 integer,换成原子组后为什么失败 词法检查器要识别in和integer两个关键字,普通分组能接受integer。为了减少回溯,把分组改为原子组,原本合法的输入却失败了。原子组并不是普通分组的无损加速开关:一旦成功离开它,组内曾经留下的其它选择就不能在... yunqueblog/ 技术教程/ 2026-10-03/ 2 阅读
JavaScript RegExp.escape:输入只是一个文件名,句点为什么变成了匹配规则 给一组名称增加搜索框时,直接写 new RegExp(query) 看起来很方便。输入 a.b 后,axb 和 a-b 也可能被选中,因为句点已经作为正则语法参与匹配。若用户输入的是要查找的文字,应在构造模式以前明确... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python re.findall 捕获组:只加了一对括号,结果为什么从整段变成编号 脚本从文本里提取零件编号,原来返回 A-12、B-34。后来为了方便给字母部分加上分组,输出突然只剩 A、B;再加一组数字,结果又变成元组。匹配位置可能完全没变,改变的是 findall 根据捕获组数量决定的返回结构... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash BASH_REMATCH:辅助函数匹配一次,外层捕获结果为什么被换掉 解析任务名称时,外层正则已经拿到了类型和编号,接着调用一个辅助函数检查编号是否全是数字,再读取捕获数组却发现类型不见了。问题可能发生在检查函数里:它执行了另一次正则匹配,把同一个 BASH_REMATCH 数组改成了... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Unicode 片假名校验:长音符明明在词里,Script 为什么不认它 看起来属于一个词,不等于只有一种脚本属性给片假名输入框写正则时,很容易使用 Script=Katakana,再用加号要求一个或多个字符。单独测试“コ”能通过,换成“コーヒー”却失败。问题出在中间的长音符“ー”,也就是... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python 正则搜索起点:pos 已经移到中间,为什么 ^ 仍不匹配那里 从日志中找到正文起点后,把这个位置传给编译后正则的 search,以为表达式里的 ^ 就会把那里当开头。结果普通文字能找到,加了行首锚点却返回 None。pos 限制从哪里开始尝试匹配,没有把原字符串切成一段新字符串... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
JavaScript 后行断言:同样的贪婪分组,为什么在左边少拿了一个字符 把两个捕获组移进后行断言,表达式仍然匹配成功,但第一个组从 ab 变成 a,第二个组从 c 变成 bc。不是贪婪规则失效了,而是断言从当前位置向左检查,右侧的组先获得匹配机会。判断分组结果时,必须把方向一起带进推演。... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python 重叠文本匹配:用零宽前瞻找出 ABABA 里的两个 ABA 需要数出现位置,而不是切出互不重叠的片段在 ABABA 中,ABA 可以从位置零开始,也可以从位置二开始,两次出现共用了中间的 A。直接使用 re.finditer("ABA", text) 却只返回一次。这并非正则... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
JavaScript 正则匹配区间:相同文字出现两次,怎样标中真正捕获的那一段 解析日志后要高亮一个数字,代码先拿到捕获文本,再调用 indexOf 搜索它的位置。如果同一行里相同数字出现两次,就可能标错第一处。正则实际上已经知道自己匹配了哪一段,启用 d 标志便能把这份位置一并取回。匹配区间以... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读