【问题标题】:I want to count a same letter if the previous letter is the same as the current letter如果前一个字母与当前字母相同,我想计算同一个字母
【发布时间】:2021-04-29 17:08:47
【问题描述】:

我有输入字符串"lorrem ipsssum dollorrrrum",我想计算相同的字母如果 当前字母与上一个相同字母并将所有下一个相同的字母更改为计数的那个字母,

我希望确切的结果如下所示:

"lor2emips3umdol2or4um"

我被卡住了,我不知道我应该使用什么算法,以及在谷歌中搜索这个问题的关键字:(

到目前为止我写的代码

function countLetter(str) {
    return str
        .replace(/\s/g, '')
        .split('')
        .reduce((a, b) => {
            return a === b ? b.replace(b, '') : b;
        });
}

window.onload = function () {
  console.log(countLetter('lorrem ipsssum dollorrrrum'));
}

【问题讨论】:

    标签: javascript arrays replace


    【解决方案1】:

    使用正则表达式,您可以捕获一个字符,然后反向引用同一个字符 1 次或多次。使用替换函数将匹配的部分替换为完整匹配中的字符和字符数:

    function countLetter(str) {
        return str
            .replace(/\s/g, '')
            .replace(/(\w)\1+/g, (match, char) => char + match.length);
    }
    
    console.log(countLetter('lorrem ipsssum dollorrrrum'));

    【讨论】:

    • 谢谢你的回答,你拯救了我的一天,但是,除了正则表达式还有什么吗?我的意思是正则表达式对于像我这样的初学者来说太复杂了。
    • 模式(\w)\1+ 超级简单,你不应该害怕使用它。 \w - 匹配一个字符 \1+ - 重复捕获的字符 1 次或多次。当然,还有其他选择,但我认为这是迄今为止最清晰、最简洁的方法
    【解决方案2】:

    使用交替和捕获组,您还可以使用单个替换。

    使用三元运算符,检查捕获组 1 是否存在。如果是,则返回组 1 中的单个单词字符(参数g1)并附加总匹配的长度(参数m)。

    如果没有组 1,则由于替换 | 而匹配了 1+ 个或更多空白字符,它们被替换为空字符串。

    (\w)\1+|\s+
    

    解释

    • (\w)\1+group 1 中捕获单个单词 char 并重复相同的 char 1 次或更多次,这在反向引用中 \1
    • |或者
    • \s+ 匹配 1+ 个空格字符

    const countLetter = s => s
      .replace(/(\w)\1+|\s+/g, (m, g1) => g1 ? g1 + m.length : '')
    
    console.log(countLetter('lorrem ipsssum dollorrrrum'));

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2014-05-26
      • 1970-01-01
      相关资源
      最近更新 更多