JavaScript按多分隔符分割字符串并保留分隔符,代码输出异常求助
问题分析与解决方案
你的需求核心是三个关键点:
- 保留单词末尾的分隔符(标点)并将其移到对应单词前方
- 反转连字符连接的复合词(比如
super-project→project-super) - 整体反转所有单词的顺序
先看看你当前代码的问题:
- 正则表达式匹配范围错误:你用的
/([.'\!'+a-zA-Z]+)/g没有包含连字符,导致super-project会被拆成super、-、project三个片段,反转后就出现了project - supe...的错误。 - 没有针对性处理标点和复合词:这个正则把字母和标点混在一起匹配,既没法单独提取标点移到前面,也没法处理连字符复合词的反转。
- split后产生空字符串:正则匹配的片段之间的空格会被分割成空元素,导致最终结果有多余空格。
修正后的代码方案
我们可以分步处理,逻辑更清晰:
function test(string) { // 1. 按空格分割成独立项,过滤空项(处理多空格情况) const items = string.split(/\s+/).filter(item => item); // 2. 处理每个项:标点前置、复合词反转 const processedItems = items.map(item => { // 先处理末尾的标点:提取末尾的.!'等标点,移到单词前面 const punctuationMatch = item.match(/([.!']+)$/); if (punctuationMatch) { const punctuation = punctuationMatch[1]; const word = item.slice(0, -punctuation.length); item = punctuation + word; } // 处理连字符复合词:拆分后反转再拼接 if (item.includes('-')) { item = item.split('-').reverse().join('-'); } return item; }); // 3. 反转整个项列表,再用空格连接 const result = processedItems.reverse().join(' '); console.log(result); } // 测试输入 const string = "I'm working on a new super-project wow. Yay!"; test(string);
运行结果
执行后会输出你期望的:
!Yay .wow project-super new a on working I'm
代码解释
- 分割项:用
/\s+/匹配任意数量的空格进行分割,再过滤空项,确保每个元素都是有效单词/带标点的单词。 - 处理标点:用正则
/([.!']+)$/匹配单词末尾的标点,把标点和单词主体分离后调换位置。 - 处理复合词:判断项是否包含连字符,拆分后反转数组再重新拼接。
- 整体反转:把所有处理后的项反转顺序,最后用空格连接成结果字符串。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

