【问题标题】:How to highlight multiple words with ace editor?如何使用 ace 编辑器突出显示多个单词?
【发布时间】:2013-12-03 05:16:00
【问题描述】:

我有一个 textarea 表单域。我希望 ace 编辑器一次突出所有出现的某些预定义单词。像这样在数组中传递它们是行不通的:editor.findAll("word1","word2","..."); 我正在考虑使用正则表达式,过滤某些单个单词。这是我的代码:

<script type="text/javascript" src="/ace/src-min/ace.js" charset="utf-8"></script>
<script>
// Hook up ACE editor to all textareas with data-editor attribute
$(function () {
    $('textarea[data-editor]').each(function () {
        var textarea = $(this);
        var mode = textarea.data('editor');
        textarea.css('visibility', 'hidden');

        var editor = ace.edit(edit);
        editor.renderer.setShowGutter(false);
        editor.getSession().setValue(textarea.val());
        editor.getSession().setMode("ace/mode/" + mode);
        editor.getSession().setUseWrapMode(true); // adds vertical scrollbar


        var keywords = "word1|word2";
        keywords = new RegExp(keywords);

        editor.findAll(keywords,{
            //caseSensitive: false,
            //wholeWord: true,
            regExp: true
        });
    });
});
</script>

不幸的是,它什么也没做。也许我错过了某种图书馆?我得到了使用 codemirror (http://codemirror.net/) 的正则表达式,但想试试 ace-editor。 显然这以某种方式起作用:

var highlightWords = "word1|word2|word3|phrase one|phrase number two|etc";
 var keywordMapper = this.createKeywordMapper({
     "highlightWords": highlightWords
}, "identifier", true);

但坦率地说,我不知道如何将所有这些部分组合在一起并让它们发挥作用。 我基本上想将预定义的单词列表传递给 ace,因此它们会被突出显示。如果我没记错的话,我需要为此设置自己的突出显示规则,然后让它们与 ace-editor 一起使用。也许有人以前做过这个或者可以给我一个简单的例子?我试过这个文档(https://github.com/ajaxorg/ace/wiki/Creating-or-Extending-an-Edit-Mode),但无法理解。我什至不确定这是否是正确的起点。

【问题讨论】:

  • 如果您使用var keywords = /word1|word2/g(不带引号)或不使用g,会发生什么情况?
  • @OGHaza 你真是个天才。 var keywords = /word1|word2/g(不带引号)效果很好。不过,全局匹配参数g 是关键。如果没有g,只有第一个匹配/word1|.../g 被正确突出显示,相同单词/word1|.../g 的所有其他匹配具有不太明显的突出显示,而所有其他单词/...|word2|etc./g 根本没有任何突出显示。但为什么它不适用于引号(我认为new RegExp(keywords) 会处理这个问题?无论如何,非常感谢您的建议。您为我节省了很多时间。
  • 没问题,你能帮我一个忙并接受我发布的答案。至于为什么他们不使用引号,我猜 Javascript 将其解释为字符串文字,即使它在 RegExp(..) 中,老实说我不太确定。
  • 会的。这样我就不再需要keywords = new RegExp(keywords);了。

标签: jquery regex highlight ace-editor


【解决方案1】:

您可以执行以下操作:

var keywords = /word1|word2/g

在 Javascript 中,正则表达式不是用引号括起来的,而是用分隔符(我使用 /)和标志出现在第二个分隔符之后的。

g 是全局标志,因此正则表达式将在整个编辑器中多次匹配。

您还可以使用问题中的 keywords 变量,使用:

var keywords = new RegExp(keywords, 'g');

【讨论】:

  • 但是如何将单词列表:var word_list = "word1|word2|..." 分配给 var 关键字作为正则表达式? var keywords = "/"+word_list+"/g"; 不起作用,var keywords = new RegExp(word_list); 似乎也不起作用。
  • 嘿伙计,原来我的回答非常具有误导性。你可以使用var keywords = new RegExp(word_list, "g");
猜你喜欢
  • 2012-02-08
  • 2015-02-16
  • 1970-01-01
  • 2015-11-13
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
相关资源
最近更新 更多