JavaScript正则表达式字符串匹配/替换

JavaScript正则表达式字符串匹配/替换,javascript,regex,string,Javascript,Regex,String,给定字符串;“{abc}Lorem ipsum{/abc}{a}dolor{/a}” 我希望能够找到大括号中出现的“标记”,存储标记和找到它的索引,并将其从原始字符串中删除。我想对每个事件重复这个过程,但因为每次索引必须正确时我都要删除字符串的一部分…我找不到所有的索引,然后在最后删除它们。对于上面的例子,应该发生的是 搜索字符串 在索引0处查找“{abc}” 将{tag:“{abc}”,索引:0}推送到数组中 从字符串中删除“{abc}” 重复步骤1,直到找不到更多匹配项 根据这种逻辑,“

给定字符串;“{abc}Lorem ipsum{/abc}{a}dolor{/a}”

我希望能够找到大括号中出现的“标记”,存储标记和找到它的索引,并将其从原始字符串中删除。我想对每个事件重复这个过程,但因为每次索引必须正确时我都要删除字符串的一部分…我找不到所有的索引,然后在最后删除它们。对于上面的例子,应该发生的是

  • 搜索字符串
  • 在索引0处查找“{abc}”
  • 将{tag:“{abc}”,索引:0}推送到数组中
  • 从字符串中删除“{abc}”
  • 重复步骤1,直到找不到更多匹配项
根据这种逻辑,“{/abc}”应该在索引11处找到,因为“{abc}”已经被删除了

我基本上需要知道这些“标签”在哪里开始和结束,而不需要将它们作为字符串的一部分

我几乎可以使用正则表达式,但它有时会跳过出现的情况

let在_CURLYS=/{.*}/g之间;
设text='{abc}Lorem ipsum{/abc}{a}dolor{/a}';
让match=BETWEEN_CURLYS.exec(text);
让标签=[];
while(匹配!==null){
标签。推(匹配);
text=text.replace(匹配[0],“”);
match=在_CURLYS.exec(文本)之间;
}
console.log(文本);//应该是;同侧阴唇
控制台日志(标签);
/**
*就快到了……但是错过了“{a}”
*['{abc}',索引:0,输入:'{abc}Lorem ipsum{/abc}{a}dolor{/a}']
*['{/abc}',索引:11,输入:'Lorem ipsum{/abc}{a}dolor{/a}']
*['{/a}',索引:20,输入:'Lorem ipsum{a}dolor{/a}']

*/
您需要从regex
lastIndex
值中减去匹配长度,否则下一次迭代开始的时间比预期的要长(因为输入变短,并且在调用
replace
删除
{…}
子字符串后,
lastIndex
不会更改):

let在_CURLYS=/{.*}/g之间;
设text='{abc}Lorem ipsum{/abc}{a}dolor{/a}';
让match=BETWEEN_CURLYS.exec(text);
让标签=[];
while(匹配!==null){
标签。推(匹配);
text=text.replace(匹配[0],“”);
BETWEEN\u CURLYS.lastIndex=BETWEEN\u CURLYS.lastIndex-匹配[0]。长度;//此处
match=在_CURLYS.exec(文本)之间;
}
console.log(文本);//应该是;同侧阴唇

控制台日志(标签)这是一个非常好的答案。我正在做类似的工作,但我没有意识到
。lastIndex
是一个属性+1啊,这是有道理的!非常感谢@LewisPeel我试图想出我在你上一篇文章中提到的替换方法,但我发现它不太可能很容易工作,因为
输入部分将很难处理。@WiktorStribiżew是的,我想我们都应该忘记我上一篇文章…太多交叉线哈哈