我有以下字符串:
{:.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(})
答案 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()