正则表达式常用方法
最后更新于:2022-04-02 04:24:32
## 正则表达式知识点([中文文档](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions))
#### 创建方式
正则表达式使用单个字符串来描述
```javascript
//两种均可;
var regexObj = /abc/;
var regexObj = new RegExp("abc");
```
它有什么作用呢,简单来讲就是用来匹配规则的字符串;虽然看着很杂乱,但它却是非常强大的工具,在以后的实战项目里会经常运用到
-------
#### 标志、边界
> 正则表达式中的匹配范围: `g` 全局,`i` 忽略大小写,`m` 多行
> 边界:`\b` `^` `$`
```javascript
var regexObj = /^abc$/gi;
```
正则表达式有许多字符类和量词,需要注意的是标志和边界的用法;
* ”g“全局查询;
* ”i“ 查询不区分大小写;
* ”i“ 查询多行;
* ”^“需要匹配字符串的起始位置;
* ”$“需要匹配字符串的结束为止;
#### 字符
> 字符: `\s` 空白, `\S` 非空白, `\w` a-zA-Z0-9_,`\W` 非, `.` 除了换行的所有字符,`\d` 数字, `\D` 非数字
#### 量
> 量词: {n,m}`*` `+` `?`
* {n} n 个
* {n,} 至少n个
* {n,m} n 至 m 个
* + 1个到多个
* * 0个到多个
* ? 0个或1个
#### 分组
使用( )进行分组
| 可捕获分组 | 例 : ( A ( B ( C ) ) ) | 使用 exec() 返回的结果中存在分组的值 |
| --- | --- | --- |
| 非捕获分组 | 例: ( A (?: B ( C ) ) ) | 使用 exec() 返回的结果中不存在分组的值 |
-------
#### RegExp方法
```javascript
regexObj.test();//只返回ture或false,主要用于数据验证,并不需要得到数据本身;
regexObj.exec(str);//返回数组对象,需要注意的是数组对象的内容,因为该方法主要用于得到数据、修改数据;
```
相比于test(),exec()方法有几个重要属性;
```javascript
const str = 'The Quick Brown Fox Jumps Over The Lazy Dog';
const regexObj = /quick\s(brown).+?(jumps)/ig;
result = regexObj.exec(str);
```
| 对象 | 属性/索引 | 描述 | 例子 |
| --- | --- | --- | --- |
| result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
| | [1], ...[n ] | 括号中的分组捕获 | [1] = Brown , [2] = Jumps |
| | index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 |
| | input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog |
* result; 返回的是一个数组对象;
* result[0]; 表示匹配的子字符串,非常重要,需要牢记;
* result.index; 表示匹配的子字符串位置;非常重要,需要牢记;
* result.input; 表示字符串本身;
*****
#### 贪婪与非贪婪匹配
```javascript
var re = /abc+/;
var str = "abccccccccc";
```
那么如果需要匹配的字符串中含有abccccccccc时,re该匹配”abc“还是整段的”abccccccccc“?
结果是默认下匹配abccccccccc,也就是贪婪匹配,而非贪婪匹配方法如下:
```javascript
var re = /abc+?/;
```
下面是字符类和量词的非贪婪匹配:
* `*?` 重复任意次,但尽可能少重复
* `+?` 重复1次或更多次,但尽可能少重复
* `??` 重复0次或1次,但尽可能少重复
* `{n,m}?` 重复n到m次,但尽可能少重复
* `{n,}?` 重复n次以上,但尽可能少重复
* * * * *
尝试使用`?:` `?=` `?!`三个字符类;
```javascript
var re1 = /(a(?:b(c)))/; // 非捕获组;
var re2 = /(abc(?=def))/; // 后缀=def则匹配abc;
var re3 = /(abc(?!def))/; // 后缀≠def则匹配abc;
```
';