360前端星计划学习笔记(五)正则的三个应用场景–王峰老师
360前端星计划学习笔记(六)NodeJS基础入门

文章目录

  • 正则
    • 正则表达式的创建和使用
      • 创建正则表达式的两种方式
      • 正则表达式的常见用法
    • 场景一:正则与数值
      • 数值判断
        • /[0-9]+/
        • /^\d+$/
        • /^[+-]?\d(\.\d+)?$/
        • /^[+-]?(?:\d*\.)?\d+$/
      • 完整的数值正则
      • 用正则处理数值
        • 数值的解析
    • 场景二:正则与颜色
      • 16进制表示法
      • rgb/rgba表示法
      • hsl
      • 用正则处理颜色
    • 场景三:正则与URL
      • 用正则解析URL
      • 用正则解析Search
      • 总结
  • NodeJS
    • NodeJS简介
    • Node.js基础
      • 模块
      • 模块类型
      • 模块路径查找
      • js模块解析
      • 模块缓存
    • NPM
      • NPM 包管理器
      • package.json
      • 包依赖
      • NPM 问题
    • 基于Node.js的Web开发
      • Koa框架
      • ThinkJS
      • 使用ThinkJS做TODO
    • NodeJS调试
    • Node 开发角色转换

正则

正则表达式的创建和使用

创建正则表达式的两种方式

字面量

const reg=/[a-z]\d+[a-z]/i

优点:①简单方便;②不需要考虑二次转义;

缺点:①子表达式无法复用②过长的正则可读性降低

使用RegExp构造函数

const alphabet='[a-z]'
const reg = new RegExp(`${alphabet}\\d+${alphabet}`,'i')

需要注意\d使用转义

优点:①子内容可以重复使用;②可以通过控制子内容的粒度提高可读性

缺点:二次转义的问题非常容易导致bug

const reg = new RegExp(`\d`)
reg.test('1')//false
reg.test('ddd')//true

正则表达式的常见用法

  1. RegExp.prototype.test()

    const reg = /[a-z]\d+[a-z]/i;reg.test('a1a'); // true
    reg.test('1a1'); // false
    reg.test(Symbol('a1a')); // TypeError
    

    内容如果无法隐式转为字符串会抛出TypeError

  2. RegExp.prototype.source和RegExp.prototype.flags

    const reg = /[a-z]\d+[a-z]/ig;reg.source; // "[a-z]\d+[a-z]"
    reg.flags; // "gi"
    
    • RegExp.prototype.source

      返回当前正则表达式的模式文本的字符串

    • RegExp.prototype.flags

      es2015新增,返回当前正则表达式的修饰符的字符串,会对修饰符按照字母升序进行排序(gimsuy)

  3. RegExp.prototype.exec()和String.prototype.match()

    输入输出

    • 输入:

      RegExp.prototype.exec 要求输入字符串,遇到非字符串类型会尝试转换

      String.prototype.match 要求输入正则表达式,遇到其它类型会先尝试转成字符串,再以字符串为 source 创建正则表达式

  • 输出

    匹配成功,返回匹配结果

    匹配失败,返回 null

   const reg = /[a-z]\d+[a-z]/i;reg.exec('a1a'); // ["a1a", index: 0, input: "a1a", groups: undefined]
reg.exec('1a1'); // null'a1a'.match(reg); // ["a1a", index: 0, input: "a1a", groups: undefined]
'1a1'.match(reg); // nullconst reg1 = /(a)/g;reg1.exec('a1a'); // ["a", "a", index: 0, input: "a1a", groups: undefined]'a1a'.match(reg1); // ["a", "a"]
  • 特殊:当正则表达式含有 g 修饰符时,RegExp.prototype.exec 每次只返回一个匹配结果,数据格式和不含 g 修饰符相同。

    String.prototype.match 会返回所有的匹配结果,数据格式会变为字符串数组。

    由于 String.prototype.match 返回的数据格式不固定,因此大多数情况都建议使用 RegExp.prototype.exec

  1. RegExp.prototype.lastIndex;
 const reg = /(a)/g;const str = 'a1a';reg.lastIndex; // 0reg.exec('a1a'); // ["a", "a", index: 0, input: "a1a", groups: undefined]reg.lastIndex; // 1reg.exec('a1a'); // ["a", "a", index: 2, input: "a1a", groups: undefined]reg.lastIndex; // 3reg.exec('a1a'); // nullreg.lastIndex; // 0

当前正则表达式最后一次匹配成功的结束位置(也就是下一次匹配的开始位置)

注意:lastIndex 不会自己重置,只有当上一次匹配失败才会重置为 0 ,因此,当你需要反复使用同一个正则表达式的时候,请在每次匹配新的字符串之前重置 lastIndex!

5.String.prototype.replace()、String.prototype.search()、String.prototype.split()

'a1a'.replace(/a/, 'b'); // 'b1a'
'a1a'.replace(/a/g, 'b'); // 'b1b''a1a'.search(/a/); // 0
'a1a'.search(/a/g); // 0'a1a'.split(/a/); // ["", "1", ""]
'a1a'.split(/a/g); // ["", "1", ""]

场景一:正则与数值

数值判断

/[0-9]+/

[] 字符集,使用连字符 - 表示指定的字符范围,如果想要匹配连字符,需要挨着方括号放置,或进行转义,0-9 表示匹配从 0 到 9 的数字字符,常用的还有 a-z 匹配小写字母,\u4e00-\u9fa5 匹配汉字等,如果只是匹配数字,还可以使用字符集缩写 \d

+ 限定符 一个或多个

该表达式缺点:不是全字符匹配,存在误判,如 /[0-9]+/.test(‘a1’) === true

/^\d+$/

^匹配字符串开始位置,当结合 m 修饰符时,匹配某一行开始位置

$匹配字符串结束位置,当结合 m 修饰符时,匹配某一行结束位置

该表达式缺点

不能匹配带符号的数值,如+1,-2

不能匹配小数,如:3.14159

/1?\d(.\d+)?$/

() 圆括号内是一个子表达式,当圆括号不带任何修饰符时,表示同时创建一个捕获组
?在正则中有多种含义,作为限定符时,表示匹配零到一个
\. .可以匹配除换行符之外的任意字符,当结合s修饰符时,可以匹配包括换行符在内的任意字符
该表达式缺点:不能匹配无整数部分的小数,如.123会匹配失败;捕获组会有额外的开销

/2?(?:\d*.)?\d+$/

(?:) 创建一个非捕获组

*限定符,匹配零个或多个

缺点:不能匹配无小数部分的数值;不能匹配科学计数法,如 1e2、3e-1、-2.e+4

完整的数值正则

/^[+-]?(?:\d+\.?|\d*\.\d+)(?:e[+-]?\d+)?$/i

用正则处理数值

数值的解析
const reg = /[+-]?(?:\d*\.)?\d+(?:e[+-]?\d+)?(?=px|\s|$)/gi;function execNumberList(str) {reg.lastIndex = 0;let exec = reg.exec(str);const result = [];while (exec) {result.push(parseFloat(exec[0]));exec = reg.exec(str);}return result;// let array=str.split(" ");// res=array.map(item=>parseFloat(item,10));// return res.length?res.join(','):null //不会用正则的我
}console.log(execNumberList('1.0px .2px -3px +4e1px')); // [1, 0.2, -3, 40]
console.log(execNumberList('+1.0px -0.2px 3e-1px')); // [1, -0.2, 0.3]
console.log(execNumberList('1px 0')); // [1, 0]
console.log(execNumberList('-1e+1px')); // [-10]

(?=expression)

正向肯定环视 / 顺序肯定环视 / 先行断言

用于匹配符合条件的位置, 匹配到位置为止

类似的语法还有:

(?!expression) 正向否定环视 / 顺序否定环视 / 先行否定断言

(?<=expression) 反向肯定环视 / 逆序肯定环视 / 后行断言,es2018 新增

(?<!expression) 反向否定环视 / 逆序否定环视 / 后行否定断言,es2018 新增

g

全局匹配,用于取出目标字符串中所有符合条件的结果

需要注意的点:

  • 按照 CSS 规范,只有数值为 0 才可以省略单位,这种情况没有必要靠正则来过滤
  • 这个例子中只验证了 px 单位,实际还存在 pt、em、vw 等单位,并且没有考虑百分比的情况
  • 实际工作中,要根据需求追加处理逻辑

数值转货币格式

//数值转货币
function formatCurrency(str) {// ……const reg=/(\d)(?=(\d{3})+(,|$))/greturn str.replace(reg,`$1,`)}
// js方式function formatCurrency1(str) {// ……let res=''let count=0;for(let i=str.length-1;i>=0;i--){if(count==2&&i!=0){res=','+str[i]+res;count=-1;}else{res=str[i]+res}count++;}return res;}
const reg = /(\d)(?=(?:\d{3})+(?:,|$))/g;
function formatCurrency(str) {return str.replace(reg, '$1,');
}

{n}

限定符,表示重复 n 次,n 必须是非负整数

类似的语法还有:

{n, m} 表示重复 n 到 m 次,n 和 m 都必须是非负整数,且 n <= m

{n,} 表示重复 n 次以上

$n

用于 replace 的字符串中,表示第 n 个捕获组,n 可以从 1 到 9

$& 表示本次完整的匹配,所以这段代码还可以改写为:

const reg = /\d(?=(?:\d{3})+(?:,|$))/g;
function formatCurrency(str) {return str.replace(reg, '$&,');
}

在ES2018以上的环境,还可以使用反向环视

const reg = /(?<=\d)(?=(?:\d{3})+(?:,|$))/g;
function formatCurrency(str) {return str.replace(reg, ',');
}

其它注意事项

环视中的圆括号也会生成捕获组,所以都要采用 (?

360前端星计划学习笔记0410相关推荐

  1. 360前端星计划学习-html

    前端与HTML 一枚大三学生,非常感谢360前端星计划,在这里学习了很多,非常幸运获得360的校招实习offer~,非常感谢面试我的王峰老师和卢岳文老师!总的来说,这7天的学习,让我坚定了走前端这条路 ...

  2. 不怕你不来,就怕你不学—360前端星计划

    编者按:奇舞团小胖子.特别感谢国欣宇同学和刘琳同学. 是否总觉得自学 JS.HTML.CSS 小有成就但心里空虚? 眼看着<HTML 从入门到精通> 手下却一行代码十个 error ? 莫 ...

  3. 第六届360前端星计划_前端工程化浅析

    主讲人 田东东 燕山大学硕士研究生 360搜索前端团队 首届前端星计划毕业生 一.什么是前端工程化? ⼯程化的目标 在前端领域,利用技术不断进步和经验逐步积累带来的各种⽅案,来解决在项目的开发.测试. ...

  4. 第六届360前端星计划_深入CSS

    主讲人 赵文博 360前端技术专家 奇舞团 一.选择器的特异度(Specificity) 提出问题:哪条规则生效? <article><h1 class="title&qu ...

  5. 360前端星计划--Node.js 基础入门

    01 什么是 Node.js Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. https://node ...

  6. 360前端星计划--技术翻译:进阶的直梯

    文学翻译 非文学翻译 艺术成分多一些 科学成分多一些 需要更多的灵感 需要更多的勤奋 责任小一些 责任大一些 技术翻译的意义 翻译技术文章,学习新技术思想 翻译技术文档,掌握标准和工具 翻译技术图书, ...

  7. 360前端星计划—技术翻译:进阶的直梯(李松峰)

    1. 翻译类型 文学翻译和非文学翻译 文学翻译 非文学翻译 艺术成分多一些 科学成分多一些 需要更多的灵感 需要更多的勤奋 责任小一些 责任大一些 2. 技术翻译的意义 翻译技术文章,学习新技术思想 ...

  8. 第六届360前端星计划_前端代码的自我修养

    主讲人:孙磊 一.如何衡量代码质量的好坏 衡量代码质量的唯一有效标准:WTF/min -- Robert C. Martin 代码的自我修养 代码规范 格式 流程化 二.代码规范 yarn globa ...

  9. 2018年前端星计划等你来报名!

    是否总觉得自学JS.HTML.CSS,小有成就但心里空虚?是否混迹在各大前端论坛,寻寻觅觅,但心里总觉得没有方向感?你需要一个引路人,需要一个心灵的导师.别慌!这里是360前端星计划! 前端星计划是由 ...

最新文章

  1. 【组队学习】曹志宾:基于Python的会员数据化运营
  2. 论文笔记 DNorm: disease name normalization with pairwise learning to rank
  3. 2020年丘赛放榜:北大斩获5金11银强势霸榜
  4. C++ leetcode 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外
  5. 3.1 基础-抛小球
  6. 复制内存时检测到可能的io争用条件_这篇高并发服务模型大科普,内部分享时被老大表扬了...
  7. WeihanLi.Npoi 1.20.0 Released
  8. LeetCode 942. 增减字符串匹配
  9. AngularJS 学习笔记值post传值
  10. 社会工程学攻击的三个典例
  11. [转载] 怎样彻底卸载anaconda?
  12. 可以退税吗_个人所得税APP详细操作步骤来了!你成功“退税”了吗?
  13. 丢失MSVCR71.dll问题解决
  14. 2017年小米春招内推面试面经
  15. Web基础——CSS基础概念(2)
  16. 捕获数据包(Wireshark)
  17. 制造业生产过程中多源异构数据处理方法综述
  18. 《金匮要略》试卷二(A)
  19. wps表格宏被禁用如何解禁_office 2007 禁止宏提示“宏已被禁用”的解决办法
  20. win10 apex安装

热门文章

  1. MATLAB 如何做16进制运算
  2. Pygame实战之外星人入侵NO.11——设置开始按钮
  3. Python 将MP3音频文件转换成MIDI乐谱文件
  4. 1.vector::clear和vector::erase的区别
  5. mysql表别名不加as_数据库别名AS区别
  6. 从循环条件的代码里,我能在面试中甄别程序员是否是高级
  7. AI公开课:19.05.30 瞿炜-新东方AI研究院院长《做懂教育的AI:把未来带进现实》课堂笔记以及个人感悟
  8. 漂亮的表格样式(使用CSS样式表控制表格样式)
  9. Python获取多核CPU温度 均值
  10. 单片机三角波c语言程序,三角波单独发生 单片机程序