【问题标题】:CodeMirror Modes: match subset of line with regexCodeMirror 模式:将行的子集与正则表达式匹配
【发布时间】:2017-07-02 22:16:42
【问题描述】:

我正在尝试为 CodeMirror 创建一个模式叠加层。

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

例如:

# h1

变成:

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

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

我设法创建了以下有效的模式,但匹配整行,因此生成的 html 如下:&lt;span class="cm-overlay cm-markup"&gt;# h1&lt;/span&gt;

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 来“吃掉”匹配的字符,但没有提到如何在仍然使用正则表达式的同时只标记一个小节。

我真的不知道如何继续。

【问题讨论】:

    标签: regex codemirror codemirror-modes


    【解决方案1】:

    我有点想通了。

    我仍然不完全理解它为什么起作用,但以下代码与正则表达式匹配,但由于某种原因不会将自身限制为捕获组(数组大小仅为 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;
    
                }
            };
        });
    

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2018-06-10
      • 2016-02-16
      • 2017-11-13
      • 2013-08-05
      相关资源
      最近更新 更多