【问题标题】:Remove all consonants in a string before a vowel then add a character删除字符串中元音之前的所有辅音,然后添加一个字符
【发布时间】:2018-10-02 20:27:15
【问题描述】:

我想在元音出现之前删除字符串中的所有辅音,然后用“r”替换它。 这意味着“scooby”将变为“rooby”,“xylographer”将变为“rographer”等等。这是我想出的算法: 1. 检查输入类型是否不是字符串。 2. 使用一个变量(newStr) 来保存小写转换和分词。 3. 声明一个变量(arrWord)来保存数组的长度。 4. 另一个名为 regex 的变量,用于检查字符串是否以辅音开头 5. 变量 newArr 保存最终结果。 6. 搜索数组,如果字符串不以辅音开头 加入它并返回它。 7. Else 继续寻找单词中第一个元音出现的位置。 8.找到后,删除元音出现前的所有字符(辅音) 并用 r 替换它们。 9. 一起加入阵列。

我已经能够想出这个:

    const scoobyDoo = str => {
    if(typeof str !== 'string'){
        return 'This function accepts strings only';
    }   
    let newStr = str.toLowerCase().split('');
    let arrWord = newStr.length;
    let regex = /[aeiou]/gi;
    for (let i = 0; i < arrWord; i++){
        if (newStr[0].match(regex)) {
            let nothing = newStr.join('');
            return nothing;
        }
        else {
            let vowelIndex = newStr.indexOf(str.match(regex)[0]);
            newStr.splice(0, vowelIndex, 'r');
            return newStr.join('');
        }
    }
}
console.log(scoobyDoo('scOoby')); 

我通过大写第一个元音索引再次测试了该程序,而不是“rooby”,我得到了“rscooby”。为什么呢?

【问题讨论】:

  • 这是一个数组。 var newStr = str.toLowerCase().split(''); 所以你不能在整个数组上调用.match - 选择数组中的一个元素来调用它的字符串方法。

标签: javascript string


【解决方案1】:

您可以尝试在 else 中使用以下代码并查看更改

else {
  var vowelIndex = newStr.indexOf(str.match(regex)[0]);
  newStr.splice(0, vowelIndex, 'r');
  return newStr.join("");
}

【讨论】:

    【解决方案2】:

    这样不是更容易吗?还是我错过了什么??

    'xylographer'.replace(/^\s*[^aieou]+(?=\w)/i,function(m,o,s){return "r"})
    //"rographer"
    'scooby'.replace(/^\s*[^aieou]+(?=\w)/i,function(m,o,s){return "r"})
    //"rooby"
    

    【讨论】:

    • 它工作得很好,但我不介意进一步解释正则表达式,尤其是函数 (m,o,s)。谢谢
    • 您需要阅读一下 js 规范。 m o s 指的是匹配偏移量和传递给替换函数的字符串。我猜正则表达式很清楚,它匹配所有非元音,直到第一个元音。 replaces 将与 r 交换匹配项。在这种情况下,不使用参数,但是当您需要进行更复杂的替换时,它会很方便。
    • 谢谢。 JS 规范是指 MDN 文档还是其他内容?请提供有用的链接
    • developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 归结为使用替换函数而不是字符串。
    【解决方案3】:

    您可以只对整个算法使用一个 reg 表达式,而无需再拆分您的字符串。

    要使用的正则表达式。

    /^[^aouie, AOUIE]+(?=[aouie, AOUIE])/g

    当然,您可以重新调整正则表达式以更适合您,但这将满足您的主要要求。

    【讨论】:

      【解决方案4】:

      在 else 语句之后的那一行,我刚刚调用了 .toLowerCase() 并修复了它: let vowelIndex = newStr.indexOf(str.match(regex)[0].toLowerCase());

      【讨论】:

        【解决方案5】:

        我喜欢让我的代码简单易读

        function pattern(str){
            var vowelIndex = str.indexOf(str.match(/[aeiou]/)); //returns index of first vowel in str
                return "r" + str.slice(vowelIndex);
        }
        console.log(pattern('xylographer'));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-20
          • 2017-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多