Javascript执行维护状态

Javascript执行维护状态,javascript,regex,Javascript,Regex,我目前正在尝试用Javascript构建一个小的模板引擎,用find替换html5标记中的标记,并用regex替换 我在正则表达式上使用exec,并循环处理结果。我想知道为什么正则表达式在它的当前形式中有/g标志,但是没有它就可以了 检查中断的示例并删除正则表达式上的/g标志以查看正确的输出 var TemplateEngine = function(tpl, data) { var re = /(?:&lt;|<)%(.*?)(?:%&gt;|>)/g, mat

我目前正在尝试用Javascript构建一个小的模板引擎,用find替换html5标记中的标记,并用regex替换

我在正则表达式上使用exec,并循环处理结果。我想知道为什么正则表达式在它的当前形式中有/g标志,但是没有它就可以了

检查中断的示例并删除正则表达式上的/g标志以查看正确的输出

var TemplateEngine = function(tpl, data) {
  var re = /(?:&lt;|<)%(.*?)(?:%&gt;|>)/g, match;
  while(match = re.exec(tpl)) {  
    tpl = tpl.replace(match[0], data[match[1]])
  }

  return tpl;
}
var TemplateEngine=函数(tpl,数据){
变量re=/(?:|)g,匹配;
而(match=re.exec(tpl)){
tpl=tpl.replace(匹配[0],数据[匹配[1]]
}
返回第三方物流;
}

有没有人能给我解释一下,为什么我的例子完全是这样的:

<p><%more%></p>

检查此链接。使用g标志时,存储正则表达式的对象(re)将跟踪上次匹配在
lastIndex
属性中的位置,下次使用该对象时,搜索将从
lastIndex
的位置开始

要解决此问题,您可以每次手动重置
lastIndex
属性,也可以不在对象中保存正则表达式并将其内联使用,如下所示:

while(match = /(?:&lt;|<)%(.*?)(?:%&gt;|>)/g.exec(tpl)) {
while(匹配=/(?:|))/g.exec(tpl)){

中解释了原因

您需要的解决方案实际上是一个
字符串。用回调替换

var TemplateEngine = function(tpl, data) {
  var re = /(?:&lt;|<)%(.*?)(?:%&gt;|>)/g, match;
  return tpl.replace(re, function($0, $1) { 
     return data[$1] ? data[$1] : $0;
  });
}
var TemplateEngine=函数(tpl,数据){
变量re=/(?:|)g,匹配;
返回tpl.replace(re,函数($0,$1){
返回数据[$1]?数据[$1]:$0;
});
}

在这里,正则表达式按顺序查找字符串中所有不重叠的匹配项,并将匹配项传递给回调方法。
$0
是完全匹配项,
$1
是组1内容。如果
数据[$1]
存在,则使用它替换整个匹配项,否则,将整个匹配项插回