如何用JavaScript正则将n次重复的字符/换行减少为n-1次
解决方案
1. 通用连续相同字符次数减1实现
要实现把连续n个相同字符替换为n-1个,可通过正则匹配连续字符后动态截取内容实现,代码如下:
/** * 把字符串中连续出现的指定字符数量减1 * @param {string} str 原始字符串 * @param {string} targetChar 要处理的目标字符 * @returns 处理后的字符串 */ function reduceConsecutiveChar(str, targetChar) { // 转义正则特殊元字符,避免*、.这类字符匹配出错 const escapedChar = targetChar.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const reg = new RegExp(`${escapedChar}{2,}`, 'g'); // 匹配到连续字符后,去掉第一个剩下的就是n-1个 return str.replace(reg, match => match.slice(1)); } // 星号场景测试 console.log(reduceConsecutiveChar("Hello ***** World", "*")); // 输出结果:Hello **** World
2. 列表项之间多余换行处理实现
针对你实际业务中有序、无序列表项之间的换行减1需求,可直接使用以下可落地代码:
/** * 减少有序/无序列表项之间的多余换行,n个换行替换为n-1个 * @param {string} str 原始字符串 * @returns 处理后的字符串 */ function reduceNewLineBetweenListItems(str) { // 正则匹配规则:前一行是列表项 + 2个及以上换行 + 下一行是列表开头 const listReg = /((?:\d+\. +[^\n]*|• {3}[^\n]*))(\n{2,})((?:\d+\. +|• {3}))/g; return str.replace(listReg, (_, prevContent, newLines, nextListPrefix) => { // 连续换行去掉第一个,实现数量减1 return `${prevContent}${newLines.slice(1)}${nextListPrefix}`; }); } // 业务场景测试 const originStr = `1. Hello • World • 测试无序列表 2. 测试有序列表接无序列表 • 测试内容`; console.log(reduceNewLineBetweenListItems(originStr)); /* 输出结果: 1. Hello • World • 测试无序列表 2. 测试有序列表接无序列表 • 测试内容 */
该实现支持有序列表接无序列表、无序列表接有序列表、同类型列表之间的多余换行处理,不管中间原有多少空行都能自动减1。
内容的提问来源于stack exchange,提问作者Hari Das
相关产品推荐
相关产品推荐

