在Monaco Editor中如何获取Token的实际值?
获取Monaco Tokenize结果中的Token实际值
monaco.editor.tokenize方法返回的token[][]结构里,每个token确实只包含language、offset和type属性,不过你可以通过原文本结合token的offset属性提取实际值,具体操作如下:
- 先将原文本按行拆分,因为
token[][]是按行对应的(每一个子数组对应原文本的一行) - 遍历每一行的tokens,通过当前token的
offset和下一个token的offset(或行尾)计算出token的起止位置,再从该行文本中截取对应内容
代码示例
const text = "你的目标文本内容"; const tokens = monaco.editor.tokenize(text, "myLanguage"); // 将原文本拆分为行数组 const lines = text.split('\n'); tokens.forEach((lineTokens, lineIndex) => { const currentLine = lines[lineIndex]; lineTokens.forEach((token, idx) => { // 计算当前token的结束位置 const endOffset = idx < lineTokens.length - 1 ? lineTokens[idx + 1].offset : currentLine.length; // 从原行文本中截取token值 const tokenValue = currentLine.substring(token.offset, endOffset); // 按需处理token值,这里以打印为例 console.log(`类型: ${token.type}, 值: ${tokenValue}`); }); });
补充说明
Monaco的tokenize方法设计上只返回语法高亮所需的位置和类型信息,不直接返回token值是为了避免重复存储原文本内容,提升性能。如果是在已有编辑器实例的场景下,也可以通过编辑器模型的getValueInRange方法获取,但离线tokenize时,上面的截取方法是最直接的方案。
内容的提问来源于stack exchange,提问作者skyman lee
相关产品推荐
相关产品推荐

