CodeMirror模式:匹配线的子集与正则表达式

时间:2017-07-02 22:16:43

标签: regex codemirror codemirror-modes

我正在尝试为CodeMirror创建模式覆盖。

我有一堆经过测试的正则表达式匹配行的各个部分(来自流),我想如果我可以使用这些来匹配和标记部分行。

例如:

# h1

变为:

<span class="..."><span class="cm-overlay cm-markup">#</span> h1</span>

除了simplemode插件外,我还无法找到在模式中使用正则表达式的任何示例。这个问题与我正在做的非常相似,但是没有关于如何仅为流线的子集返回令牌的答案:CodeMirror - Using RegEx with overlay

我设法创建了以下模式,但匹配整行,因此生成html,如:<span class="cm-overlay cm-markup"># h1</span>

CodeMirror.defineMode("markdown-extra", function() {
    return {
        token: function(stream, state) {
            markup = stream.match(/^([#]{1,6})[^#]/g); // matches markdown header syntax
            stream.skipToEnd();

            if (markup){
                console.log(markup, stream)
                return "markup"
            }

            return null
        }
    };
});

文档要我使用stream.match来&#34;吃&#34;匹配的字符,但没有提到如何在仍然使用正则表达式时仅标记子部分。

我真的不知道如何继续。

1 个答案:

答案 0 :(得分:0)

我有点想通了。

我仍然不完全理解它为什么会起作用,但是下面的代码与正则表达式相匹配,但由于某种原因,它并不局限于捕获组(数组的大小只有1)。

CodeMirror.defineMode("markdown-extra", function() {
        return {
            token: function(stream, state) {

                // ## header matching
                matchArray = stream.match(/^([#]{1,6}) /g);
                if (matchArray != null) {
                        var match = matchArray[0];
                        console.log(matchArray);
                        stream.match(match);
                        return "markup"
       }
                while (stream.next() != null && !stream.match(/^([#]{1,6})[^#]/g, false)) {}
      return null;

            }
        };
    });