中级算法 ---------- 儿童黑话

告诉我们发生了什么:

有无更优雅的解法(或者说逻辑更清晰)?还有就是r是元音还是辅音嘞?

  **你目前的代码**
function translatePigLatin(str) {
//辅音要添加的后缀
const vowel = "ay"
//元音要添加的后缀
const consonant = "way"
//元音的正则
const consonantReg = /^[a,e,i,o,u]/
//辅音的正则
const vowelReg = /\w*?(?=[a,e,i,o,u,r])/
//开头非元音的长度
const len = str.match(vowelReg).toString().length
/*判断是元音还是辅音,元音直接加后缀,
辅音则slice开头非元音的长度的字母,拼接到单词后面,最后加上后缀*/

return consonantReg.test(str) ? 
str + consonant : str.slice(len) + str.match(vowelReg).toString() + vowel
}

挑战: 中级算法 - 儿童黑话

挑战的链接:

  1. r是辅音不是元音;

  2. 辅音的正则有一个简单的表达: /[^a,e,i,o,u]/ ;
    (当然使用这个方法默认传入的参数一定是英文单词,题干也确实这样)

  3. 既然辅音的正则可以这样表达,那就可以进一步直接用正则把以辅音开头的单词的从开头到第一个元音字母(不包括)全部摘出来: /[1]+/;

  4. 处理字符串的方法用.match()搭配.substring()

所以是:

function translatePigLatin(str) {
  if (str.match(/^[a,e,i,o,u]/)){
    return str + 'way';
  }else{
    const cluster = str.match(/^[^a,e,i,o,u]+/).toString();
    return str.substring(cluster.length) + cluster + "ay";
  }
}

顺便推荐一个我觉得还蛮好用的查正则的工具:regex101


  1. ^a,e,i,o,u ↩︎