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

Codewars按单词内数字排序问题:求解释正则排序逻辑

问题解答:根据单词中的数字排序字符串的JS函数解析

先整体梳理这个函数的执行流程:

  • words.split(' '):把输入的字符串按空格分割成单词数组。如果输入是空字符串,分割后得到[""],后续排序和拼接后依然是空字符串,符合题目要求。
  • .sort(...):对单词数组按规则排序,这是核心逻辑。
  • .join(' '):把排序后的数组重新拼接成空格分隔的字符串,作为结果返回。

核心:排序时的比较函数详解

排序函数里的function(a,b)是给数组的sort方法用的比较器,它的作用是告诉sort两个单词a和b谁应该排在前面,关键就在a.match(/\d/) - b.match(/\d/)这部分:

  1. 正则/\d/的作用:\d是正则表达式里的元字符,用来匹配任意一个0-9的数字字符。题目明确每个单词里都包含一个1-9的数字,所以a.match(/\d/)会返回一个只包含这个数字的数组,比如单词Thi1s调用后返回["1"],is2调用后返回["2"]。
  2. 数字转换与比较:在JavaScript中,当数组和数字进行减法运算时,数组会先被转换为字符串(比如["1"]变成"1"),然后自动转换成数字类型(1)。所以a.match(/\d/) - b.match(/\d/)本质就是拿a单词里的数字减去b单词里的数字。
  3. sort方法的规则:sort方法根据比较函数的返回值决定顺序:
    • 如果返回负数,a会排在b前面;
    • 如果返回正数,b会排在a前面;
    • 返回0则保持两者相对位置不变。
      这里用数字相减的结果做返回值,正好实现了按单词中的数字从小到大排序,完全符合题目中“数字代表单词位置”的要求。

举个实际例子,比如处理"is2 Thi1s T4est 3a"时:

  • 分割后得到数组["is2", "Thi1s", "T4est", "3a"]
  • 排序时,Thi1s的数字是1,is2是2,1-2=-1,所以Thi1s排在is2前面;
  • 3a的数字是3,is2的数字是2,2-3=-1,所以is2排在3a前面;
  • 最终排序后的数组是["Thi1s", "is2", "3a", "T4est"],拼接后就是正确结果。

内容的提问来源于stack exchange,提问作者Kestone Dennis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:51:12