我想写一个函数,它以一个字符串名称作为参数,并返回前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".
所以,当第三个字符是元音时,它基本上就不起作用了。 谢谢你的阅读。
您只需使正则表达式不区分大小写,这样它就不会因为字符串开头的大写字母而总是返回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%;}