CodeMirror - 使用带覆盖的RegEx

时间:2013-05-15 12:25:54

标签: javascript regex codemirror

我似乎无法找到使用RegEx匹配在CodeMirror中创建叠加层的任何人的示例。 Moustaches示例一次匹配一件事似乎很简单,但在API中,它表示RegEx匹配返回匹配数组,我无法弄清楚在上下文中如何处理它胡子例子中的结构。

我有一个正则表达式,可以找到我需要突出显示的所有元素:我已经测试了它并且它有效。

我应该在令牌功能之外加载数组然后匹配每个吗?或者有没有办法使用数组?

另一个问题是我想根据正则表达式中的(biz | cms)选项应用不同的样式 - 一个用于'biz'而另一个用于'cms'。会有其他人,但我试图保持简单。

这是我所拥有的。评论显示我的困惑。

CodeMirror.defineMode("tbs", function(config, parserConfig) {
    var tbsOverlay = {
        token: function(stream, state) {
            tbsArray = match("^<(biz|cms).([a-zA-Z0-9.]*)(\s)?(\/)?>");

            if (tbsArray != null) {
                for (i = 0; i < tbsArray.length; i++) { 
                    var result = tbsArray[i];
                    //Do I need to stream.match each element now to get hold of each bit of text?
                    //Or is there some way to identify and tag all the matches?

                }
            }

            //Obviously this bit won't work either now - even with regex
            while (stream.next() != null && !stream.match("<biz.", false)) {}

            return null;
        }
    };

    return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), tbsOverlay);
});

2 个答案:

答案 0 :(得分:0)

它返回由RegExp.execString.prototype.match生成的数组(例如参见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/match),因此您可能不希望迭代它,而是选择特定元素对应于正则表达式中的组(if (result[1] == "biz") ...

答案 1 :(得分:0)

查看Code Mirror方法 match()的实现,你会看到它处理两种类型的方法参数: string RegExp

你的常数

stream.match("<biz.")

是字符串类型。

RegExp 中定义:

tbsArray = /<biz./g

因此,您的信息流将与RegExp匹配。