>我有以下字符串:
{:.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(})
正则表达式中是不可能的。要么使用
{
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()
您可以使用此正则表达式:
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]);