You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Monaco Editor为何跳过首个分词规则直接匹配第二条规则?

Monaco Editor分词器规则匹配异常原因分析

问题重现

你编写的分词器代码如下:

tokenizer: {
    root: [
      [/\,\s+/, { token: 'default', next: '@test', log: 'iuhhh'}],
      [/^.{0,71}/, { token: 'default', log: 'kkkkk'}]
    ],
    test: [
      [/.*/, { token: 'comment', log: 'kjhgf', next: '@pop'}]
    ],
  },

测试文本为ddd, ddddddd时,第一条规则未被匹配,反而触发了第二条/^.{0,71}/规则。

核心原因

问题出在第二条规则的正则表达式上:

  • 该规则的^锚定了当前行的开头,而.{0,71}会匹配从行首开始的0到71个任意字符。你的测试文本长度远小于71,因此整个文本会被这条规则直接匹配。
  • Monaco Editor的分词器是按规则列表顺序,从当前文本位置尝试匹配规则,一旦某条规则匹配成功,就会执行其逻辑,不会再尝试后续规则。
  • 第一条规则/\,\s+/的匹配目标是逗号加空格,但由于第二条规则先匹配了从行首开始的整个文本,第一条规则根本没有触发的机会。

解决思路

如果需要让第一条规则优先匹配逗号加空格的内容,可修改第二条规则的正则,避免其覆盖第一条规则的匹配范围,例如:

  • 把第二条规则的正则改为/^[^,]{0,71}/,表示匹配行首开始的、不包含逗号的0到71个字符,这样就不会覆盖逗号及之后的内容,第一条规则就能正常触发。

内容的提问来源于stack exchange,提问作者guoqing deng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:43:12