我似乎无法找到使用RegEx匹配在CodeMirror中创建叠加层的任何人的示例。 Moustaches示例一次匹配一件事似乎很简单,但在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);
});
答案 0 :(得分:0)
它返回由RegExp.exec
或String.prototype.match
生成的数组(例如参见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/match),因此您可能不希望迭代它,而是选择特定元素对应于正则表达式中的组(if (result[1] == "biz") ...
)
答案 1 :(得分:0)
查看Code Mirror方法 match()的实现,你会看到它处理两种类型的方法参数: string 和 RegExp 强>
你的常数
stream.match("<biz.")
是字符串类型。
在 RegExp 中定义:
tbsArray = /<biz./g
因此,您的信息流将与RegExp匹配。