如何在Monaco Editor中配置支持多行字符串的语法高亮规则
解决Monaco Editor自定义语言多行引号字符串高亮问题
你猜的没错!Monaco的Monarch tokenizer默认是逐行解析内容的,所以你的正则表达式没法跨越多行匹配字符串。不过解决起来很简单,只需要给你的令牌规则加上@multiLine标志,同时微调正则表达式来正确匹配跨换行的内容就行。
修改后的令牌配置代码
// 为语言注册令牌提供器 monaco.languages.setMonarchTokensProvider('mySpecialLanguage', { tokenizer: { root: [ // 添加@multiLine标志,让正则可以跨多行匹配 [/"(?:[^"\\]|\\.)*"/gi, { token: 'my-string', next: '@pop', @multiLine: true }], ] } }); // 定义仅匹配该语言规则的新主题 monaco.editor.defineTheme('myCoolTheme', { base: 'vs', inherit: false, rules: [ { token: 'my-string', foreground: '0000FF' }, ] });
关键调整说明
@multiLine标志:这是核心!加上这个标志后,Monarch会允许当前正则表达式跨越多行文本进行匹配,而不是局限在单一行内。- 正则表达式优化:把原来的
\\.\n{0,}改成\\.就足够了,因为\\.已经可以匹配任何转义字符(包括转义后的换行),而@multiLine会让整个正则自然跨换行匹配未转义的内容。 next: '@pop':虽然不是必须,但加上它可以明确告诉令牌解析器,匹配完字符串后回到之前的状态,让语法解析更严谨。
这样调整后,无论是单行的"A single line quote"还是跨多行的"But also a slightly weird multi line quote\nwith line breaks"都会被正确识别并高亮成蓝色啦!
内容的提问来源于stack exchange,提问作者Maffelu
相关产品推荐
相关产品推荐

