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
相关产品推荐
相关产品推荐

