Monaco Editor Monarch相邻括号合并为单Token,求正确匹配正则
解决方案
你遇到的相邻括号被合并为同一个Token的核心原因是:Monarch 分词器按规则从上到下的优先级匹配,优先返回最长匹配结果,你当前的括号匹配规则要么优先级低于其他通用符号匹配规则,被其他规则先命中了连续的()字符串,要么规则本身配置了多字符匹配量词。
按以下方式修改配置即可解决:
- 调整规则优先级,将括号匹配规则放到
tokenizer对应状态规则的最顶部,确保括号优先被单字符匹配:
tokenizer: { root: [ // 放在所有运算符、分隔符规则的最前面,优先匹配单个括号 [/[{}()\[\]]/, '@brackets'], // 后续再放其他符号匹配规则,例: [/[+\-*/=<>!&|^%]+/, '@operator'], // 其余规则... ] }
- 如果需要更精准的括号类型识别(方便后续自动补全逻辑判断左右括号),可以拆分定义不同括号的匹配规则,完全避免合并:
tokenizer: { root: [ [/\(/, '@brackets.parentheses.open'], [/\)/, '@brackets.parentheses.close'], [/\{/, '@brackets.curly.open'], [/\}/, '@brackets.curly.close'], [/\[/, '@brackets.square.open'], [/\]/, '@brackets.square.close'], // 其余规则... ] }
修改完成后使用「Developer: Inspect Tokens」功能验证,即可看到(和)被识别为两个独立的Token。
内容的提问来源于stack exchange,提问作者vmlopr
相关产品推荐
相关产品推荐

