提问者:小点点

JavaScript:基于正则表达式返回昵称的函数


我想写一个函数,它以一个字符串名称作为参数,并返回前3或4个字母作为昵称。 如果第3个字母是辅音,则返回前3个字母。

nickname("Robert") //=> "Rob"
nickname("Kimberly") //=> "Kim"

如果第3个字母是元音,返回前4个字母。

nickname("Jeannie") //=> "Jean"
nickname("Douglas") //=> "Doug"

如果字符串少于4个字符

return "Error: Name too short".

我的尝试

function nicknameGenerator(name){

  return (name.length<4? 'Error: Name too short.' :

          /^[a-z]{2}[aeiou]/.test(name)?

          name.slice(0,4) : name.slice(0,3)
  )
}

调用时,函数返回

nickname("Robert") //=> "Rob"
nickname("Douglas") //=> "Dou"
nickname("Jim") //=> "Error: Name too short".

所以,当第三个字符是元音时,它基本上就不起作用了。 谢谢你的阅读。


共3个答案

匿名用户

您只需使正则表达式不区分大小写,这样它就不会因为字符串开头的大写字母而总是返回false(注意正则表达式后面的i):

function nicknameGenerator(name){

  return (name.length<4? 'Error: Name too short.' :

          /^[a-z]{2}[aeiou]/i.test(name)?

          name.slice(0,4) : name.slice(0,3)
  )
}

匿名用户

您的测试匹配两个小写字符,但不匹配大写字符。

使用

/^[a-z]{2}[aeiou]/i.test

/^[a-zA-Z]{2}[aeiou]/.test

匿名用户

实际上不需要使用regex来获取子字符串:

null

const names = ['Robert', 'Douglas', 'Kimberley', 'Jeannie', 'Jim']

      nickname = s => s.slice(0,3)+([...'aouie'].includes(s[2]) ? s[3] : '')

console.log(names.map(nickname))
.as-console-wrapper{min-height:100%;}