CodeMirror — использование RegEx с наложением

Кажется, я не могу найти пример использования совпадений RegEx для создания наложения в CodeMirror. Пример Усы, сопоставляющий одну вещь за раз, кажется достаточно простым, но в 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);
});

person Enigma Plus    schedule 15.05.2013    source источник


Ответы (2)


Он возвращает массив, созданный RegExp.exec или String.prototype.match (см., например, https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/match), поэтому вы, вероятно, не хотите перебирать его, а выбираете определенные элементы соответствуют группам в вашем регулярном выражении (if (result[1] == "biz") ...)

person Marijn    schedule 16.05.2013

Посмотрите на реализацию метода Code Mirror match(), и вы увидите, что он обрабатывает параметр метода для двух типов: string и RegExp.

Ваша постоянная в

stream.match("<biz.")

имеет строковый тип.

Определите его в типе RegExp:

tbsArray = /<biz./g

Таким образом, ваш поток будет сопоставлен с RegExp.

person rock_walker    schedule 19.05.2014
comment
Это все замечательно, но проблема в том, как использовать совпадающий результат в примере. В моем примере я начинаю с совпадения — есть идеи, как его обработать? tbsArray = match(^‹(biz|cms).([a-zA-Z0-9.]*)(\s)?(\/)?›); - person Enigma Plus; 20.05.2014