在正则表达式中捕获重复的组

时间:2014-03-03 19:58:55

标签: javascript regex ace-editor

我有以下字符串:

{:.test1, .test2, .test3}

我用它作为Markdown的扩展。对于那个字符串,我想要一个高亮的语法与ace。但是我无法构建匹配的正则表达式来捕获正确的组。

我需要捕获的是:{:作为第一组。第二组中的所有.test#。所有,作为第三组,最后}

我想出的当前正则表达式是:({:)(\\.\\w+)(,\\s*|)

但是,这仅匹配:{:.test1,,而不是以下.test2,

我需要的是一个正则表达式,它捕获{:,然后是.test1,以及最后}

的所有事件

目的是为逗号添加不同于类名的颜色,因此我需要捕获它。

请参阅https://github.com/ajaxorg/ace/wiki/Creating-or-Extending-an-Edit-Mode

还有例子:

{
  token : ["constant", "keyword"],
  regex : "^(#{1,6})(.+)$"
} // ### Header -> constant(###), keyword( Header)

这里他们匹配我需要的两组,但是有4组。

{
  token : ["constant", "keyword", "variable", "constant"],
  regex : "unknown"
} 
// {:.test1, .test2} -> constant({:), keyword( .test1), keyword(.test2), variable(,), constant(})

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

s = '{:.test1, .test2, .test3}';
m = s.match(/(\{:)((?:\.\w+[^.}]*)+)(\})/);
//=> ["{:.test1, .test2, .test3}", "{:", ".test1, .test2, .test3", "}"]

修改

var re = /(\.\w+)(, *)?/g,
    words = [], commas = [],
    input = m[2];
while (match = re.exec(input)) { words.push(match[1]); commas.push(match[2]); }

console.log(m[1], words, commas, m[3]);

答案 1 :(得分:1)

使用一个正则表达式是不可能的。使用

    {
        onMatch : function(v) {
            var tokens = v.slice(2, -1).split(/(,\s+)/).map(function(v) {
                return {
                    value: v,
                    type: v[0]=="."? "keyword" : "variable"
                }
            })
            tokens.unshift({value: "{:", type: "constant"})
            tokens.push({value: "}", type: "constant"})
            return tokens;
        },
        regex : "{:((\\.\\w+)(,\\s*|))+}"
    }

this.$rules = {
    "start" : [ {
        token : "constant",
        regex : "{:",
        next : [{
            regex: "\\.\w+",
            token: "keyword"
        },{
            regex: ",",
            token: "variable"
        },{
            regex: "$|}",
            token : "constant",
            next: "pop"
        }]
    }]
};
this.normalizeRules()