对字符串的指定的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

我可能看问题描述看的不是特别仔细(但非常感谢你努力把问题描述得如此清晰)。


猛地看应该使用正则表达式解决。


继续加油!:)

0
2
liuyubobobo
回复
甲骨文_0001
是的。而正则表达式本质就是把这类字符串的问题“封装成了一个工具”,直接使用就好。很多字符串算法,都被封装在了正则表达式这个工具的内部。
2023-06-15
共2条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程