出来混总是要还的-JS正则前传
栏目: JavaScript · 发布时间: 6年前
内容简介:前言: 正则表达式一直是个人痛点, 相信很多人 (看到题的第一反应就是, 握草这还不简单, 两层循环加上珍藏多年的字符串拼接技术(-_-||), 妥妥的解决这个问题写完并且测试结果正确, 就开始沾沾自喜, 感觉万事大吉。( 这种状态很像在工作中, 写完功能不去优化一样 )
前言: 正则表达式一直是个人痛点, 相信很多人 ( 说的就是你 ) 跟我一样存在类似的情况, 正则是反复学, 反复忘, 从个人角度看主要的原因还是:较少的使用场景, 如果像数组的几个常用方法一样, 绝大多数人肯定能熟练运用。 最近迫使我拿起正则这把屠龙刀的起因是( 时间充足和一道小的面试题 ), 那咱们就先从这道面试题说起
Demo1
// 观察如下规律, 写一个函数`accum` // accum("abcd"); // "A-Bb-Ccc-Dddd" // accum("helloWorld"); // "H-Ee-Lll-Llll-Ooooo-Wwwwww-Ooooooo-Rrrrrrrr-Lllllllll-Dddddddddd" // accum("China"); // "C-Hh-Iii-Nnnn-Aaaaa" 复制代码
看到题的第一反应就是, 握草这还不简单, 两层循环加上珍藏多年的字符串拼接技术(-_-||), 妥妥的解决这个问题
const accum = str => { let result = ""; str.toLowerCase().split("").forEach((el, idx) => { for (let i = 0; i <= idx; i++) { if (i == 0) { result += el.toUpperCase(); } else { result += el; } } result += el + "-"; }); return result.slice(0, -1); // 看到slice慌不慌?是不是忘记这鬼东西是干什么的了?和substr/string有什么区别? }; console.log(accum("CHina")); 复制代码
写完并且测试结果正确, 就开始沾沾自喜, 感觉万事大吉。( 这种状态很像在工作中, 写完功能不去优化一样 )
上面的一坨代码, 对, 就是一坨代码, 一坨像极了业务功能的逻辑代码, 没有精巧的思路, 没有精致的写法。 这踏马跟咸鱼有什么区别?
优雅的循环
const accum = str => { let result = ""; for (let i = 0; i < str.length; i++) { const temp = str[i]; result += temp.toUpperCase(); for (let j = i; j > 0; j--) { result += temp.toLowerCase(); } result += "-"; } return result.slice(0, -1); }; console.log(accum("CHina")); 复制代码
优雅的循环, 优雅的循环, 优雅的循环 啊、啊、啊!
精致的利己主义者
const accum = str => { return Array.from(str.toLowerCase(), (item, index) => { return ( item.toUpperCase() + Array.from({length: index}, () => { return item; } ).join("") ); }).join("-"); }; console.log(accum("CHina")); 复制代码
放荡不羁的 reduce
const accum = str => { return Array.from(str.toLowerCase()).reduce((accu, cur, idx) => { accu.push(cur.toUpperCase().padEnd(idx + 1, cur)); return accu; }, []).join("-"); }; console.log(accum("CHina")); 复制代码
百辟匕首( RegExp )
匹配与获取字符串方法
const accum = str => { return str.toLowerCase().replace(/\w{1}/gi, (item, idx) => { let temp = ""; Array.from(new Array(idx)).map(() => { temp += item; }); return `${item.toUpperCase()}${temp}-`; }).slice(0, -1); }; console.log(accum("CHina")); 复制代码
怎么样, 最后几种方案看的是不是很刺激、很惊喜, 其实就是一堆奇葩操作, 这是 API
操作者的狂欢, 也是 JS
开发者的基本功^_^
这几个方案里面最令人惊喜的还是 replace
, 当第二个参数是一个函数, 当第一个参数为正则表达式并且为全局匹配模式时, 这个方法每次匹配都会被调用。
replace 应该是正则的 6 个常用 API 中最强大的一个, 它可以拿到你想要的信息, 并且假借替换之名, 做一些神奇操作
传送门 -> 正则操作的6个常用方法( 字符串实例4个, 正则实例2个 )
注:
- \w 匹配单词字符, 等价于[0-9a-ZA-Z_], 数字字母下划线
- {1} 连续出现 1 次
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 出来混总是要还的-JS正则常用的有四种操作: 验证、切分、提取、替换
- cocosdx接bugly,上传符号表,有一部分内容解析出来了, 另一部分没有解析出来
- 培训班出来的怎么了?
- SamSam作者又出来浪了
- 明明存在,怎么搜索不出来呢?
- MyBatis 的插件对象如何创建出来的
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
挑战程序设计竞赛
秋叶拓哉、岩田阳一、北川宜稔 / 巫泽俊、庄俊元、李津羽 / 人民邮电出版社 / 2013-7-1 / CNY 79.00
世界顶级程序设计高手的经验总结 【ACM-ICPC全球总冠军】巫泽俊主译 日本ACM-ICPC参赛者人手一册 本书对程序设计竞赛中的基础算法和经典问题进行了汇总,分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由浅入深、由易及难的细致讲解,并介绍了许多实用技巧。每章后附有习题,供读者练习,巩固所学。 本书适合程序设计......一起来看看 《挑战程序设计竞赛》 这本书的介绍吧!