Ace Editor中含Unicode重音字符的关键词高亮问题
解决Ace Editor中带重音Unicode关键词的高亮问题
问题出在\b是ASCII单词边界,仅匹配[a-zA-Z0-9_](即\w)与非\w字符的边界。带重音的Unicode字符属于\W范畴,因此以重音字符结尾的单词,其与后续空白/标点的位置不满足\b的匹配条件,导致无法被识别。
解决方案
使用Unicode属性类自定义单词边界,同时开启正则的Unicode模式(u标志),具体修改如下:
this.$rules = { "start": [ { // 自定义Unicode单词边界,匹配含重音的字母、数字、下划线 regex: new RegExp("(?<![\\p{L}\\p{M}\\p{N}_])[\\p{L}\\p{M}\\p{N}_]+(?![\\p{L}\\p{M}\\p{N}_])", "u"), token: keywordMapper }, ] }; this.normalizeRules()
正则说明
(?<![\p{L}\p{M}\p{N}_]):反向预查,确保当前位置前不是单词字符(\p{L}匹配所有语言字母,\p{M}匹配重音等附加标记,\p{N}匹配数字,_保留原规则)[\p{L}\p{M}\p{N}_]+:匹配一个或多个合法的单词字符(包含带重音的Unicode字母)(?![\p{L}\p{M}\p{N}_]):正向预查,确保当前位置后不是单词字符"u"标志:开启Unicode模式,让正则正确解析Unicode属性类与字符
适配含特殊字符的关键词
如果你的关键词包含撇号(如jusqu’à),只需把撇号加入单词字符集即可:
regex: new RegExp("(?<![\\p{L}\\p{M}\\p{N}_'])[\\p{L}\\p{M}\\p{N}_']+(?![\\p{L}\\p{M}\\p{N}_'])", "u")
内容的提问来源于stack exchange,提问作者Laurent
相关产品推荐
相关产品推荐

