Codewars-Javascript训练手册:正则表达式(Regular Expressions)
Autocomplete! Yay!(字符串自动补全)
The autocomplete function will take in an input string and a dictionary array and return the values from the dictionary that start with the input string. If there are more than 5 matches, restrict your output to the first 5 results. If there are no matches, return an empty array.(autocomplete 函数输入一个字符串和字典数组,返回开头是该字符串的值,返回值的个数最多限制为5个,无匹配则返回空数组)
对于输入字符串的要求:Any input that is NOT a letter should be treated as if it is not there. For example, an input of “$%^” should be treated as “” and an input of “ab*&1cd” should be treated as “abcd”.
Example:
autocomplete('ai', ['airplane','airport','apple','ball']) = ['airplane','airport']
初始解决方案:
function autocomplete(input, dictionary){
var str = input.replace(/[^A-Za-z]+/g,'');
var pattern = new RegExp('^'+str,'i');
var temp = dictionary.filter(function(value){
if(pattern.test(value)){return true;
}else{
return false;
}
});
return temp.length<6?temp:temp.slice(0,5);
}
知识点:创建一个正则表达式有两种方式,一是直接量语法var reg = /pattern/
适用于正常输入的正则表达式,二是创建 RegExp 对象,语法是new RegExp(pattern, attributes);例如:var reg = new RegExp('pattern','gi')
第二种语法适用于对正则表达式的拼接。注意第一种语法直接输入正则的内容即可,解释器通过/×××/
这样的形式确认类型为RegExp对象。而第二种语法则类似字符串的写法。
优化代码:
//正则表达式的变量pattern可以简写为:
var pattern = new RegExp('^'+input.replace(/[^A-Za-z]+/g,''),'i')
//Array的slice语法中的第二个参数可以大于Array的长度,对输出无影响,例:
var tt = ['a','b'];
console.log(tt.slice(0,5));//输出为 ["a", "b"]
//因此可以简化最后一步的判断输出结果是否超过5个值
return dictionary.filter(function(w){ return r.test(w); }).slice(0, 5);
所以,最简的代码是:
function autocomplete(input, dictionary){
var r = new RegExp('^' + input.replace(/[^a-z]/gi,''), 'i');
return dictionary.filter(function(w){ return r.test(w); }).slice(0, 5);
}
这正是Codewars上得票最高的答案。
Credit Card Mask(信用卡字符加密)
给出一个函数maskify用“#”字符替换超过4个字符的字符串,4个字符则返回自身。例如:
maskify("4556364607935616") == "############5616"
maskify( "64607935616") == "#######5616"
maskify( "1") == "1"
maskify( "") == ""
本以为可以用一个正则表达式可以解决问题,然而发现RegExp {X}
量词中x必须为数字。于是将原字符串分割开进行匹配,代码如下:
function maskify(cc) {
var len = cc.length;
if(len<5){
return cc;
}else{
//对字符串分割后进行正则匹配
return cc.slice(0,len-4).replace(/\w/g,'#') + cc.slice(len-4);
}
}
然而,我忘了正则的另外一个用法:/regexp(?=n)/
?=n 量词匹配任何其后紧接指定字符串 n 的字符串,但匹配的内容并不包括指定字符串n。
所以,Codewars最简短的代码正是如此:
function maskify(cc) {
return cc.replace(/.(?=....)/g, '#');
//也可写出cc.replace(/.(?=.{4})/g, '#')
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现