(Python) 格式规范中的 f-string 嵌套替换字段在错误的大括号处关闭 `subst`

作者: maximilliangrand创建于 2026年8月15日更新于 2026年8月16日

**语言:** Python (明确指定,不自动检测) **版本:** 11.12.0 **使用:** `highlight` (不是 `highlightAuto`) **描述问题** 在 f-string 格式规范中的嵌套替换字段(动态宽度/精度,例如 `f"{x:{w}}"`)在内部 `}` 上关闭了 `subst` 区域。该字段自己的关闭 `}` 然后作为纯文本字符串输出,而 `subst` 区域最终出现了大括号不平衡。 **可重现的示例代码** Python f"{x:{w}}" **实际情况** — `hljs.highlight('f"{x:{w}}"', {language:'Python'}).value`: html <span class="hljs-string">f&quot;<span class="hljs-subst">{x:{w}</span>}&quot;</span> `subst` 区域是 `{x:{w}`(未匹配的 `}`)和最后的 `}` 在字符串中渲染,而不是作为字段的一部分。 `f"{value:{width}.{prec}f}"` 以同样的方式失败。 **预期行为** 整个 `{x:{w}}` 是一个单个替换字段,而嵌套的 `{w}` 本身也是一个字段。这是有效的 Python — `{w}` 以动态方式设置宽度(`f"{x:{w}}"` 使用 `x=42, w=6` → `' 42'`)。关闭的 `}` 应属于字段,而不是泄漏到字符串中,而 `subst` 区域应具有大括号平衡。 **原因** `src/languages/Python.js` 中的 `SUBST`(开始: /\{/, 结束: /\}/)不包含自身(`SUBST.contains = [STRING, NUMBER, PROMPT]`),因此它在第一个内部 `}` 处结束,无法处理嵌套替换字段。 协助者: Claude Opus 4 (高)

内容来源: highlightjs/highlight.js