You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript按多分隔符分割字符串并保留分隔符,代码输出异常求助

问题分析与解决方案

你的需求核心是三个关键点:

  • 保留单词末尾的分隔符(标点)并将其移到对应单词前方
  • 反转连字符连接的复合词(比如super-project→project-super)
  • 整体反转所有单词的顺序

先看看你当前代码的问题:

  1. 正则表达式匹配范围错误:你用的/([.'\!'+a-zA-Z]+)/g没有包含连字符,导致super-project会被拆成super、-、project三个片段,反转后就出现了project - supe...的错误。
  2. 没有针对性处理标点和复合词:这个正则把字母和标点混在一起匹配,既没法单独提取标点移到前面,也没法处理连字符复合词的反转。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:53:46