#### 1. 正则是思维方式
```
```
#### 2. 一道面试题
```
用 JS 实如下功能:
将给定的数字转化成千分位的格式
如把“10000”转化成“10,000”
```
90%的人可能是这么思考的
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98%201.png)
1%的人才能想得到对的方法
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98%202.png)
#### 3. 什么是正则
模式和标志尾
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%BB%80%E4%B9%88%E6%98%AF%E6%AD%A3%E5%88%99%201.png)
```
对象字面量
var obj = {
hello: true
};
构造函数
var obj = new Object();
obj.hello = true;
var reg = new RegExp('(?=(?!\\b)(\\d{3})+$)','g')
```
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%BB%80%E4%B9%88%E6%98%AF%E6%AD%A3%E5%88%99%202.png)
```
A - Java PHP Python JS 等等都有正则,但语法稍微有点不同。影响其实也不大,你精通了 JS 的正则,其他语言的正则也能很快上手。
B - 既可以 /[abc]/来声明正则,也可以 new RegExp('[abc]') 来声明,一个是字面量,一个是构造函数。
C - 正则一般由 pattern 和 flag 。
```
#### 4. 基本语法
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%20.png)
#### 5. 基本语法实战
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%E5%AE%9E%E6%88%98%20.png)
http://coding.imweb.io/demo/p7/regexp-basic.html
```
var remail = /^[0-9a-z\-.]+@[0-9a-z\-.]+$/;
var email = 'liaozhou@qq.com';
console.log(remail.test(email));
//console.log(/^\w*s/.test(''));
```
```
检测字符串是不是数字开头
var reg = /^[0-9]/; // 正则写在这里
// 下面的变量,其结果都要符合预期
var ret1 = reg.test('i love regular expression');
var ret2 = reg.test('啊哈33哈哈好3');
var ret3 = reg.test('12345wwww');
```
#### 6. RegExp 对象
```
var reg = /(\w)/ig;
//console.dir(reg);打印对象
//console.log(reg.exec('aaqrea'));
//console.log(reg.test('_'));
```
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/RegExp%20%E5%AF%B9%E8%B1%A1%201.png)
#### 7. flags
http://coding.imweb.io/demo/p7/regexp-obj.html
```
i(ignoreCase) 忽略大小写
g(global) 全局匹配
m(multiline) 多行匹配
```
```
var reg = /(\w)/igm; ----igm是标志位
//console.log(reg.ignoreCase);忽略大小写
//console.log(reg.global);
//console.log(reg.multiline);
//console.log(reg.source);
//console.log(/a/i.test('A'));---i是标志位:忽略大小写
//console.log('abnababa'.match(/a/g));---g是标志位,全局匹配a,全部找出
//console.log('ab\nababab'.match(/^a/gm));---- ^:开始符,\n:换行符,全局匹配多行a 开头的,那么length:2
```
#### 8. 重复(量词)
http://coding.imweb.io/demo/p7/regexp-repeat.html
![]https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E9%87%8D%E5%A4%8D%E9%87%8F%E8%AF%8D.png()
#### 9. 重复(量词)实战
```
var reg = /^https?:\/\/ke\.q{2}\.com\/$/
console.log(reg.test('https://ke.qq.com/'));
^ 和 $ 是开始与结尾的标志符,防止乱七八糟的开头或者结尾
var reg2 = /^https?:\/\/ke\.q{2}\.com\/.+$/;
console.log(reg2.test('https://ke.qq.com/index.html'));
.+ 表示后面必须有1次及以上的重复
var reg2 = /^https?:\/\/ke\.q{2}\.com\/.*$/;
console.log(reg2.test('https://ke.qq.com/'));
.* 重复0次或者1次
```
手机号码 : var rPhone = /^1\d{10}$/;
#### 10. 分组与捕获
![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E5%88%86%E7%BB%84%E4%B8%8E%E6%8D%95%E8%8E%B7%20.png)
```
010101
(01){3} 分组
(liao) love (?:coding|girl) | 或者的意思
```
#### 11. 引用和反向引用
```
var ret3 = /(liao) love (coding|girl)/.exec('liao love girl'); ----引用
console.log(ret3[1], 'b', RegExp.$2);
var reg = /<(div)>.*<\/\1>/;//反向引用
console.log(reg.test('<div>ssfsfsfssf</div>'))
```
```
源字符串:abcdebbcde
正则表达式:([ab])\1
对于正则表达式“([ab])\1”,捕获组中的子表达式“[ab]”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。
考察一下这个正则表达式的匹配过程,在位置0处,由“([ab])”匹配“a”成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“a”,“\1”也就确定只有匹配到“a”才能匹配成功,这里显然不满足,“\1”匹配失败,由于没有可供回溯的状态,整个表达式在位置0处匹配失败。
正则引擎向前传动,在位置5之前,“([ab])”一直匹配失败。传动到位置5处时,,“([ab])”匹配到“b”,匹配成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“b”,“\1”也就确定只有匹配到“b”才能匹配成功,满足条件,“\1”匹配成功,整个表达式匹配成功,匹配结果为“bb”,匹配开始位置为5,结束位置为7。
扩展一下,正则表达式“([a-z])\1{2}”也就表达连续三个相同的小写字母。
```
##### 过滤出年月日
```
这就是目标字符串:20130213 ,(年)(月)(日) 这种形式,非常的常见。
现在要把年、月、日分别捕获出来,即实现如下代码效果:
reg.exec('20130213') //结果: ['20130213', '2013', '02', '13']
var rDate = /^(\d{4})((?:0|1)?\d)((?:0|1|2|3)?\d)$/; // 正则写在这里
// ^ 和 $ 不多说了
// (\d{4}) 捕获四位数字的年份
// ((?:0|1)?\d) 月份条件 ?:表示非捕获型分组 ? 表示 0 次或者 1 次
// ((?:0|1|2|3)?\d) 和月份差不多
// 下面的变量,其结果都要符合预期
var ret1 = rDate.exec('20130211');
var ret2 = rDate.exec('20133211');
var ret3 = rDate.exec('2013211');
var ret4 = rDate.exec('2013251');
var ret5 = rDate.exec('201321');
```
#### 12. 贪婪匹配和惰性匹配
http://coding.imweb.io/demo/p7/regexp-greedy-vs-lazy.html
```
贪婪(greedy)匹配:普通量词
惰性(lazy)匹配:普通量词加?
非贪婪,non-greedy
```
```
var s ='<span>hello</span><span>world</span>';
var reg = /<span>.+?<\/span>/;
console.log(reg.exec(s));
```
#### 13. 正向前瞻和负向前瞻
正向前瞻(?=)
负向前瞻(?!)
![]()
#### 14. 正向前瞻和负向前瞻实战
\s :表示空格
```
找出 jero love coding
var reg1 = /jero(?=\slove\scoding)/g;
var reg2 = /jero(?!\slove\sgirl)/g;
var target = 'jero love coding jero love girl jero love coding';
console.log(target.match(reg1));
```
```
找出只要不是:jero love girl
var reg1 = /jero(?=\slove\scoding)/g;
var reg2 = /jero(?!\slove\sgirl)/g;
var target = 'jero love coding jero love girl jero love coding jero love writing';
console.log(target.match(reg2));
```
```
只找到img 和 hello
var target = 'img.jpg style.css script.js hello.jpg'
var reg = /\b(\w+)(?=\.jpg)\b/g;
console.log(target.match(reg))
```
#### 15. String 对象
```
String
```
#### 16. 解题
```
```
- Part 0:开启你的Web前端之旅
- 学习大纲
- Part 1:HTML 基础
- 认识HTML
- HTML元素
- 专业级开发环境
- 嵌套及HTML树
- Part 2:CSS 基础
- CSS 盒子
- CSS 基础
- 锻造利器——编辑器
- 属性和值
- 选择器
- 样式计算
- Part 3:HTML CSS
- CSS动画
- CSS布局
- CSS预处理
- 响应式
- Part 4:JS 基础
- BOM
- DOM
- JavaScript 语言基础
- jQuery 简单教程
- 流程控制
- 事件
- Part 5:JS 进阶
- Canvas进阶
- canvas入门
- 创建对象
- 继承
- Part 6:性能与工程
- nodejs简介
- 工程化
- 浏览器渲染简述
- 模块化
- 性能
- 网络通路简介
- Part 7:JS 应用开发
- Ajax
- React
- 设计模式
- 正则表达式
- Part 8:项目中的测试
- Jest
- 基本概念
- Part 9:安全攻防战
- Cookie
- CSRF
- XSS
- 更多安全
- Part 10:面经大放送
- 面试经验