修改正则分割后的数组后,如何用原分隔符还原字符串?
保留原分隔符拼接修改后的数组元素
嘿,这个需求我之前也碰到过——用正则分割字符串后原分隔符就丢了,要按原来的位置拼回去确实得巧处理。给你两种实用的实现方式,看哪种更对你胃口:
方法1:用split的捕获组保留分隔符
JavaScript的split方法有个小技巧:如果你的正则表达式里包含捕获组(用()包裹的部分),那么分割后的数组会把捕获到的分隔符也作为单独元素保留下来,刚好符合我们的需求:
const str = "Hello+Beautiful#World"; // 把分隔符放在捕获组里,split后会保留分隔符 const parts = str.split(/([+#])/); // 此时parts = ["Hello", "+", "Beautiful", "#", "World"] // 对元素进行修改,这里给每个元素加上001、002这样的后缀 const modifiedParts = parts.map((item, index) => { // 偶数索引的是原字符串里的元素,奇数索引的是分隔符 if (index % 2 === 0) { // 计算是第几个元素(从1开始),补零成3位 const elementOrder = (index / 2) + 1; return `${item}${elementOrder.toString().padStart(3, '0')}`; } else { // 分隔符直接原样返回 return item; } }); // 拼接成最终字符串 const result = modifiedParts.join(''); console.log(result); // 输出:Hello001+Beautiful002#World003
这个方法逻辑直观,数组结构清晰,一眼就能区分元素和分隔符,修改起来很顺手。
方法2:用match同时捕获元素和分隔符
另一种思路是直接用match把所有元素和分隔符都提取出来,再逐个处理:
const str = "Hello+Beautiful#World"; // 正则匹配:先匹配非分隔符的元素,再匹配可选的分隔符,全局匹配 const parts = str.match(/([^+#]+)([+#])?/g).filter(Boolean); // 此时parts = ["Hello", "+", "Beautiful", "#", "World"] // 同样修改元素 const modifiedParts = parts.map((part, index) => { // 判断当前部分是不是分隔符 if (/[+#]/.test(part)) { return part; } else { // 计算元素的序号,这里元素在偶数索引位 const elementOrder = Math.floor(index / 2) + 1; return `${part}${elementOrder.toString().padStart(3, '0')}`; } }); const result = modifiedParts.join(''); console.log(result); // 同样输出目标字符串
这个方法适合你想更灵活控制捕获内容的场景,比如如果分隔符有更复杂的规则,调整正则会更方便。
小提醒
如果你的原始字符串开头或结尾可能出现分隔符(比如"+Hello#World"或"Hello+Beautiful#"),分割后数组会出现空字符串,这时候可以在处理前先过滤掉空元素,比如parts.filter(item => item.trim() !== ''),避免修改时出现不必要的空内容后缀。
内容的提问来源于stack exchange,提问作者Aslam
相关产品推荐
相关产品推荐

