ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 正则表达式知识点([中文文档](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); ``` | 对象 | <span class="Apple-tab-span" style="white-space:pre"></span>属性/索引 | 描述 | 例子 | | --- | --- | --- | --- | | 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; ```