// 现有一字符串:
// String str = "aaa[bbb[ccc,ddd[eee,fff]],ggg[hhh,iii]]";
// 要求,取出所有类似 xxx[xxx,xxx] 结构的字符串 ,
// 思路:从内到外进行匹配符合条件的字符串,然后
// 把符合条件的字符串使用指定字符串(例如:000,111,222)代替,
// 继续对替换后的字符串进行匹配,然后按照上述替换规则替换,
// 把所有符合条件的替换后的字符串保存在res中,
// 按照: {000:"需要替换的字符串",111: "",222:"" }
// 这个格式保存在obj对象中,用于后期的还原
let res=[];
let str="aaa[bbb[ccc,ddd[eee,fff]],ggg[hhh,iii]]";
let count=0; // 用于生成替换的字符串: 000,111等
let obj={}; // 保存替换规则对象,用于后期还原
let pattern=/\w{3}\[\w{3},{1}\w{3}\]/g; // 用于匹配的正则(由内到外)
let temp=str.match(pattern); // 进行匹配字符串,存在返回一个数组,不存在返回null
while(temp){
temp.forEach((item,index)=>{
obj[(""+count).repeat(3)]=item;
res.push(item);
str=str.replace(item,(""+count).repeat(3));
count++;
});
temp=str.match(pattern); // 进行下一次的匹配,匹配不到返回null;
}
let result= res.map((item,index)=>{
for(let key in obj){
item=item.replace(key,obj[key]);
}
return item;
})
console.log(result)
// 在我定义正则表达式的时候,使用g表示全局搜索,所有在while中使用item作为查找的条件,
// 如果你使用g 修饰符, 你就可以在while循环中直接使用pattern作为查找条件