Javascript 正则表达式不匹配所有实例

Javascript 正则表达式不匹配所有实例,javascript,regex,string,Javascript,Regex,String,我正在尝试匹配模板文本中出现的所有内容。 我的正则表达式设置如下所示 process(template : string , data: Object) { let re = /<%([^%>]+)?%>/g, match; while (match = re.exec(template)) { template = template.replace(match[0], data[match[1]]); } return temp

我正在尝试匹配模板文本中出现的所有内容。 我的正则表达式设置如下所示

process(template : string , data: Object) {
    let re = /<%([^%>]+)?%>/g, match;
    while (match = re.exec(template)) {
        template = template.replace(match[0], data[match[1]]);
    }
    return template;
}
过程(模板:字符串,数据:对象){
设re=/]+)?%>/g,匹配;
while(match=re.exec(模板)){
template=template.replace(匹配[0],数据匹配[1]];
}
返回模板;
}
如果我的模板看起来像这样

`<div class="tile">
        <span><%ENTRY_NUMBER%></span> 
        <span><%NAME%> , <%CLASS%> , <%GENDER%> , <%AGE%></span>
</div>`
<span> john <> biology <> male <> 17 </span>
`
,  ,  , 
`
它将很好地匹配第一个引用,然后继续拾取备用引用。如果html标记中有一个匹配项,它就可以正常工作,但当我在第二个span元素中使用倍数时,它会忽略其他匹配项。我认为这与有关

当我用
而不是下面的逗号来分隔这些事件时,效果很好

<span><%NAME%> <> <%CLASS%> <> <%GENDER%> <> <%AGE%></span>

结果是这样的

`<div class="tile">
        <span><%ENTRY_NUMBER%></span> 
        <span><%NAME%> , <%CLASS%> , <%GENDER%> , <%AGE%></span>
</div>`
<span> john <> biology <> male <> 17 </span>
约翰生物学男17

我已经检查了正则表达式多次,但都没有结果。

问题是
re.lastIndex
存储的值对于
template
的上一个值是正确的,但是由于您更改了
template
值,因此
re.lastIndex
对于修改后的字符串不再正确

请参见下面的简化示例:

let template=`;
设re=//g,匹配;
让数据={'NAME':'John','CLASS':'A3','GENDER':'Male','AGE':'19'};
while(match=re.exec(模板)){
console.log(re.lastIndex);
template=template.replace(匹配[0],数据匹配[1]];
控制台日志(模板);
}
控制台日志(模板);
//迭代1:re.lastIndex=16
//未定义
//索引现在介于->将跳过此匹配

//以此类推……
问题在于您不需要全局标志
g
,因为您反复执行表达式,直到不匹配为止,而需要多行标志
m

让我们=`
,  ,  , 
`;
常数re=/,,
数据={
条目编号:“1977”,
名称:“蓝色”,
类别:'脊椎动物',
性别:'男性',
年龄:40岁
};
设k=0;
而(重新测试&k++<1000){
匹配=重新执行;
如果(匹配)s=s.replace(匹配[0],数据[匹配[1]]);
}

控制台日志尝试将
while
块替换为
返回模板。替换(re,函数($0,$1){返回数据[$1]?数据[$1]:$0;})
。另外,我会在这里使用
let re=//g
作为正则表达式(以防数据键中有
%
)。感谢您的帮助,但我正在寻找代码不起作用的解释。另外,我在js中从未见过带$的变量名称。JavaScript在名称中使用
$
\
时将它们视为字母;他们没有什么特别之处。这两种方法在JavaScript代码中都很常见:
$
在jQuery代码中,以及
在下划线/Lodash代码中。他的方法的问题是
g
标志,它带来了您突出显示的
lastIndex
问题。使用
m
标志将使他的方法正常工作。是的,用回调替换更优雅:)是的,我已经提到了
re.lastIndex
会在每次匹配时修改。看:
m
flag在这里是完全多余的。只要说从他的初始源代码中删除g标志就可以解决问题。@bluehipy我同意,但它会以一种低效的方式解决问题。为什么要匹配同一文本两次?我已经说过用回调替换更优雅:)为什么要匹配同一文本两次或多次?因为javascript不会一次返回所有匹配项,所以使用exec:)您知道
m
修饰符的作用吗?提示:如果从模式中删除它,结果将是相同的。您知道
不是特殊的正则表达式元字符,不需要转义吗?