注释很详细,直接上代码
涉及知识点:
- 正则表达式
- 可选链操作符
题干:
我的答案
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
<script>
/**
* 可能会有小友觉得这题很简单,别急,是很简单但可以优化,
* 我们的目的是用更少的代码写更清晰且健壮的程序
* 首先先分析一下这个题,我们需要取到最后一个.及后面的字符串,
* 想想我们需要处理的极端情况:
* 1. 输入为空字符串 -需返回空字符串
* 2. 输入为. -需返回空字符串
* 3. 输入为.txt -需返回.txt
* 4. 输入为index.kk.js -需返回.js
*
* 条件这么多自然是正则匹配最方便了,下面我们来解析一下这个正则表达式
* ()捕获,捕获内容的下标是从1开始,这里其实也可以不需要捕获,就当温习知识点了
* \.表示匹配.,.是特殊字符,需要转义
* [^.]表示匹配除了.之外的字符,+表示匹配一次或多次,为什么需用+,这是为了满足第二种情况,.后面肯定需要接内容的
* $表示匹配字符串的结尾,这里可以解决第四种情况,我们需要的末尾符合条件的内容
*
* 万一啥也没匹配到,[1]必定报错的,难不成我们要将filename.match(regex)拿出来单独判断一下吗?
* 这里我们可以使用?.(可选链操作符)来判断,当filename.match(regex)为undefined时,filename.match(regex)?.[1]是undefined而不是报错,
* 当然这里提醒一下,牛客的判题环境不支持可选链操作符,别问问就是wa过了,但它的测例也就一个罢了,去掉.?随便过
* 最后我们再加上个||不就完美解决了匹配不到的情况嘛,完美,撒花~
*/
const _getExFilename = (filename) => {
// 补全代码
const regex = /(\.[^.]+)$/;
return filename.match(regex)?.[1]||'';
}
console.log(_getExFilename("index.html"));
console.log(_getExFilename(".txt"));
console.log(_getExFilename("index.kk.js"));
//下面两个因为返回的是空字符串,所以加了个图标作为提示
console.log("🫧"+_getExFilename("."));
console.log("🎈"+_getExFilename(""));
</script>
</body>
</html>