### 元字符
| 代码 | 说明 |
| :-----: | ----- |
| `*` | 匹配重复任意次(包括0次)|
| `+` | 匹配一次或多次(至少一次)|
| `.` | 匹配除换行符以外的任意字符|
| `\w` | 匹配字母或数字或下划线或汉字|
| `\s` | 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格|
| `\d` | 匹配数字|
| `\b` | 匹配单词开始或结束|
| `^` | 匹配字符串开始|
| `$` | 匹配字符串结尾|
<!--more-->
### 字符转义
如果想要查找匹配字符本身,则需要进行字符转义,转义符`\`,例如:`\.`,`\*`,`\\`
### 重复
| 代码 | 说明 |
| ----- | ----- |
| `*` | 重复0次或更多次|
| `+` | 重复1次或更多次|
| `?` | 重复0次或1次|
| `{n}` | 重复n次|
| `{n,}` | 重复n次或更多次|
| `{n,m}` | 重复n到m次|
### 字符类
在方括号`[]`里列出即可,如:
```js
[a-zA-z0-9]
[abedcdoi?!]
```
### 分支条件
用`|`将几种规则分割开,满足其中任意一种即匹配成功,栗子:
`0\d{2}-\d{8}|0\d{3}-\d{7}`:这个表示`0`开头,然后`2`位数字,加`-`,加`8`位数字,或者`0`开头,加`3`位数字,加`-`,加`7`位数字,比方:
`012-12345678`或者`0123-1234567`
注意:匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。所以特别要注意顺序
### 分组
分组是通过标识符`()`来进行整体的分组匹配的,栗子:
一个简单的ip匹配:`(\d{1,3}\.){3}\d{1,3}`
`\d{1,3}`匹配1到3位的数字,`(\d{1,3}\.){3}`匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字`(\d{1,3})`
正确的ip匹配`((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)`
### 反义符
| 代码 | 说明 |
| ----- | ----- |
| `\W` | 匹配任意不是字母,数字,下划线,汉字的字符|
| `\S` | 匹配任意不是空白符的字符|
| `\D` | 匹配任意非数字的字符|
| `\B` | 匹配不是单词开头或结束的位置|
| `[^x]` | 匹配除了x以外的任意字符|
| `[^aeiou]` | 匹配除了aeiou这几个字母以外的任意字符|
#### 更多高级功能
#### 后项引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
后项引用就是:重复搜索前面某个分组匹配到的文本.
例如:
`\b(\w+)\b\s+\1\b`可以用来匹配重复的单词,像`go go`, 或者`kitty kitty`。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字`(\b(\w+)\b)`,这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符`(\s+)`,最后是分组1中捕获的内容(也就是前面匹配的那个单词)`(\1)`。
你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:`(?<Word>\w+)`(或者把尖括号换成`'`也行:`(?'Word'\w+))`,这样就把`\w+`的组名指定为`Word`了。要反向引用这个分组捕获的内容,你可以使用`\k<Word>`,所以上一个例子也可以写成这样:`\b(?<Word>\w+)\b\s+\k<Word>\b`。
常用的分组:
| 分类 | 代码 | 说明 |
| ---- | ---- | ---- |
| 捕获 | `(exp)` | 匹配exp,并捕获文本到自动命名的组里|
| | `(?<name>exp)` | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)|
| | `(?:exp)` | 匹配exp,不捕获匹配的文本,也不给此分组分配组号|
| 零宽断言| `(?=exp)` | 匹配exp前面的位置|
| | `(?<=exp)` | 匹配exp后面的位置|
| | `(?!exp)` | 匹配后面跟的不是exp的位置|
| | `(?<!exp)` | 匹配前面不是exp的位置|
| 注释 | `(?#comment)` | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读|
#### 零宽断言
> 断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
> `(?=exp)`,零宽度正预测先行断言,断言自身出现的位置的后面能匹配表达式exp ----以xxx结尾
> `(?<=exp)`,宽度正回顾后发断言,断言自身出现的位置的前面能匹配表达式exp ----以xxx开头
#### 负向零宽断言
> `(?!exp)`,零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp ---不以xxx结尾
> `(?<!exp)`,零宽度负回顾后发断言,断言此位置的前面不能匹配表达式exp ---不以xxx开头
#### 注释
`(?#comment)`
#### 贪婪与懒惰
#### 处理选项
#### 平衡组/递归匹配
#### More...
### 参考文档
1. [正则表达式30分钟入门指南](https://deerchao.net/tutorials/regex/regex.htm)
2. [.NET Framework 正则表达式](https://msdn.microsoft.com/zh-cn/library/hs600312.aspx)
<p class="over">Over!</p>
- 前端
- C1-Javascript
- H5图片分块和断点续传
- JavascriptPatterns[Stoyanstefanov]
- macotask和microtask
- 前端代码生成器
- 跨域
- 页面回到顶部滚动按钮实现
- C2-CSS
- 浏览器的一些单位
- 盒模型
- 移动端判断横竖屏
- C3-框架
- ReactNative
- 开发环境搭建(安卓篇)
- Vue
- vue+pdfjs使用
- vue+typescript使用实践
- vue+webpack3.x集成typescript
- Vue源码3
- vue源码分析1
- vue源码分析2
- vue笔记
- C4-工具
- git
- Gitlab-CICD
- mock规则
- vscode-settings
- webpack自定义命令,切换代理地址
- 正则表达式
- 深入浅出webpack
- C5-Node
- express
- express源码阅读
- nightmare使用指南
- 爬虫1.0
- C6-微信
- 微信
- C7-Canvas
- 基础API
- 前端随笔笔记
- 后端
- C1-Java
- shiro
- C2-Linux
- ffmpeg
- ITerm
- Linux
- MongoDB安装
- MySql安装
- Ngnix反向代理
- 常见错误
- 备忘
- mac
- 备忘-Work
- 备忘Link
- 服务器资源
- 教程
- Hexo个人博客搭建笔录
- 文档
- CSS编码规范
- 前端编码规范
- 随笔
- 整理
- 正则
- 链接收藏
- 面试
- CodeWars题库
- CodeWars题库(二)
- Java社招面试题
- Java面试
- Web面试
- 前端笔试题
- 笔试题