regex 在Ace编辑器中突出显示具有Unicode字符(重音符号等)的单词

pw136qt2  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(108)

我需要突出到王牌编辑器的伪代码的特定关键字.我发现在下面的帖子一个很好的和简单的解决方案,工作正常:
Want to highlight/change color of certain words in Ace Editor?
但不幸的是,它只适用于由ASCII字符组成的单词,而不是非ASCII扩展的unicode字符,例如像法语这样的重音字符:等等。
因此,我修改了用于解析和查找代码regex: "\\w+\\b"中单词的正则表达式
用这个

this.$rules = {
        "start": [            
            {
                regex: "[\u{0}-\u{10FFFF}]+\\b",
                token: keywordMapper
            },
        ]
    };
    this.normalizeRules()

现在它工作正常,接受像'répéter'这样的关键字(repeat)or 'derrière'(向后),包含重音字符。但它不能识别以重音结尾的单词,例如'jusquà'(直到)或'modifié'(修改),当重音字母是单词的最后一个时。任何想法?非常感谢您的宝贵帮助!
洛朗
PS:与替代regex: ".+\\b"相同的问题

bxfogqkk

bxfogqkk1#

好的,找到了解决方案。用于突出显示单词的规则的正则表达式需要后跟一个**/u标志。但是规则的'regex'属性不能在其末尾包含标志。
Ace Editor在执行正则表达式之前添加
/g标志(/g表示全局,以便处理与正则表达式对应的所有会议事件,而不仅仅是停止到第一个)。
如果我们需要Ace添加
/u标志(命令要处理的常规表达式包括 unicode 字符),我们必须向规则添加'unicode'属性,并且该属性的值必须为true**。
然后,如果我们想选择每个由Unicode拉丁字母和数字组成的单词,我们可以使用下面的正则表达式:

[\\p{Script_Extensions=Latin}0-9]+

(note转义字符\被加倍为'regex'属性值)
最后,它给出了这个自适应的解决方案(来自上面引用的帖子:[https://stackoverflow.com/questions/43735711/want-to-highlight-change-color-of-certain-words-in-ace-editor][1]):

define('ace/mode/pseudo', [], function(require, exports, module) { var oop = require("ace/lib/oop"); var TextMode = require("ace/mode/text").Mode; var Tokenizer = require("ace/tokenizer").Tokenizer; var CustomHighlightRules = require("ace/mode/custom_highlight_rules").CustomHighlightRules; var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";
     var Mode = function() {
    this.HighlightRules = CustomHighlightRules; }; oop.inherits(Mode, TextMode);

(function() {

}).call(Mode.prototype);

exports.Mode = Mode; });

define('ace/mode/custom_highlight_rules', [], function(require, exports, module) { var oop = require("ace/lib/oop"); var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules;

var CustomHighlightRules = function() {

    var keywordMapper = this.createKeywordMapper({
        "variable.language": "this",
        "keyword": "avancer|sauter|tourner|jusquà|répéter|fois|si",
        "constant.language": "devant|à|derrière|gauche|droite|crevasse|glacier|trace|paroie|123",
        "customTokenName": "problem"
    }, "text", true);

    this.$rules = {
        
        "start": [            
            {
                regex: "[\\p{Script_Extensions=Latin}0-9]+",
                token: keywordMapper,
                unicode: true
            },
        ]
    };
    this.normalizeRules() };

oop.inherits(CustomHighlightRules, TextHighlightRules);

exports.CustomHighlightRules = CustomHighlightRules; });

相关问题