1

我似乎找不到任何人使用 RegEx 匹配在 CodeMirror 中创建覆盖的示例。一次匹配一件事的Mustaches示例似乎很简单,但在 API 中,它表示 RegEx 匹配返回匹配数组,我不知道在 mustaches 结构的上下文中如何处理它例子。

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

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

另一个问题是我想根据正则表达式中的 (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);
});
4

2 回答 2

0

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

你的不变

stream.match("<biz.")

是字符串类型的。

在RegExp类型中定义它:

tbsArray = /<biz./g

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

于 2014-05-19T14:52:33.420 回答
0

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

于 2013-05-16T10:32:22.670 回答