对字符串的指定的ID值作批量替换
来源:1-5 大厂面试为什么总考算法?
甲骨文_0001
2023-06-14
老师,这个提问是来源于我目前工作中遇到的一个需求,简化为就是对拿到的XML字符串作拷贝,先生成和原XML一样的字符串,然后要对新的XML中的id值作批量替换,像我截图中的 id=“Activity_1111”, 替换为 id=“Activity_2222222”, 只是同时,也要把 bpmnElement=“Activity_1111”,替换成 bpmnElement=“Activity_2222222”,因为 id会被其它元素所引用,所以一个id替换了,与之关联的被引用的id值也要同步替换。我的方法是分成两步来走: 1. 先取到字符串中所有id值 let arr1 = [Activity_1111, ShapeR_23145, Event_89012, …] //问下老师,这种你会用什么办法去取 2. 根据arr1数组,再生成一个arr1同大小的数组,令 let arr2 = arr1; 然后对arr2中每个元素生成另一个对应的id值,最后再拿arr2数组去更新xml字符串. 我想向老师讨教您的解决思路 : )
let xml = `<Root id="Activity_1111" >
<Rect id="ShapeR_23145" ></Rect>
<EventShape id="Event_89012" bpmnElement="Activity_1111"></EventShape>
<Flow id="Flow_0712109" sourceRef="ShapeR_23145" targetRef="Event_89012" />
</Root>`
// 1. 先取到字符串中所有id值 let arr1 = [Activity_1111, ShapeR_23145, Event_89012, ...]
let arr1 = ['Activity_1111', 'ShapeR_23145', 'Event_89012'] //问下老师,这种你会用什么办法去取
// 2. 根据arr1数组,再生成一个arr1同大小的数组
let arr2 = arr1.map(s=>{
let [name, num] = s.split('_');
let randNum = Math.random()+''
// Activity_1111=>Activity_xxxxxx(自己随机生成的数字)
let newNum = randNum.substring(randNum.length - 5)
return name+'_'+newNum;
});
// 3. 用arr2去填充原来的xml中相应的id
for(let i = 0; i < arr1.length; i ++){
xml = xml.replaceAll(arr1[i], arr2[i]);/// arr2[i] 去替换 arr1[i]
}
// 至此 xml就完成了批量替换
<!-- 原来的xml -->
<Root id="Activity_1111" >
<Rect id="ShapeR_23145" ></Rect>
<EventShape id="Event_89012" bpmnElement="Activity_1111"></EventShape>
<Flow id="Flow_0712109" sourceRef="ShapeR_23145" targetRef="Event_89012" />
</Root>
<!-- 需要对上述的xml中的id值(id中的数字部分作替换), 像下方 -->
<Root id="Activity_2222222" >
<Rect id="ShapeR_333333" ></Rect>
<EventShape id="Event_444444" bpmnElement="Activity_2222222"></EventShape>
<Flow id="Flow_55555555" sourceRef="ShapeR_333333" targetRef="Event_444444" />
</Root>
写回答
1回答
-
liuyubobobo
2023-06-14
我可能看问题描述看的不是特别仔细(但非常感谢你努力把问题描述得如此清晰)。
猛地看应该使用正则表达式解决。
继续加油!:)
022023-06-15
相似问题