正则表达式
快来分享你的内容吧~
- 2025-07-20·Java后端
- 2024-10-18·Java后端
- 2022-12-26
- 2022-12-26
- 2022-12-26
- 2022-12-26
正则表达式学习笔记
> 参考[正则表达式 – 教程 | 菜鸟教程](https://www.runoob.com/regexp/regexp-tutorial.html) ## 1.什么是正则表达式? *正则表达式(Regular Expression,简称 Regex 或 RegExp)是一种用来匹配字符串中字符组合的模式。* 简单来说就是一种匹配内容的模板。 ## 2.正则表达式的作用 - **查找:** 在文本中找到特定模式的内容 - **替换:** 将符合某种模式的文本替换为其他内容 - **验证:** 检查输入的数据是否符合预期格式 - **提取:** 从复杂文本中提取需要的信息 ## 3.正则表达式的模式 - 字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。 - 特殊字符:例如点号 `.`、星号 `*`、加号 `+`、问号 `?` 等,它们具有特殊的含义和功能。 - 字符类:用方括号 `[ ]` 包围的字符集合,用于匹配方括号内的任意一个字符。 - 元字符:例如 `\d`、`\w`、`\s` 等,用于匹配特定类型的字符,如数字、字母、空白字符等。 - 量词:例如 `{n}`、`{n,}`、`{n,m}` 等,用于指定匹配的次数或范围。 - 边界符号:例如 `^`、`$`、`\b`、`\B` 等,用于匹配字符串的开头、结尾或单词边界位置。 ## 4.正则表达式元字符和特性 #### 字符匹配 - 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。 - 元字符:元字符具有特殊的含义,例如 `\d` 匹配任意数字字符,`\w` 匹配任意字母数字字符,`.` 匹配任意字符(除了换行符)等。 #### 基本元字符 `.` (点号) - 匹配除换行符(`\n`)外的任意单个字符 示例:`a.b` 匹配 "aab", "a1b", "a b" 等 `^` (脱字符) - 匹配字符串的开始位置 - 示例:`^abc` 匹配以 "abc" 开头的字符串 `$` (美元符) - 匹配字符串的结束位置 - 示例:`xyz$` 匹配以 "xyz" 结尾的字符串 `\` (反斜杠) - 转义字符,使后面的字符失去特殊含义 - 示例:`\.` 匹配实际的点号而不是任意字符 #### 量词 - `*`:匹配前面的模式零次或多次。 - `+`:匹配前面的模式一次或多次。 - `?`:匹配前面的模式零次或一次。 - `{n}`:匹配前面的模式恰好 n 次。 - `{n,}`:匹配前面的模式至少 n 次。 - `{n,m}`:匹配前面的模式至少 n 次且不超过 m 次。 #### 字符类 - `[ ]`:匹配括号内的任意一个字符。例如,`[abc]` 匹配字符 "a"、"b" 或 "c"。 - `[^ ]`:匹配除了括号内的字符以外的任意一个字符。例如,`[^abc]` 匹配除了字符 "a"、"b" 或 "c" 以外的任意字符。 - `[A-Z]`:表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 #### 边界匹配 - `^`:匹配字符串的开头。 - `$`:匹配字符串的结尾。 - `\b`:匹配单词边界。 - `\B`:匹配非单词边界。 #### 分组和选择元字符 `()` (圆括号) - 定义子表达式或捕获组 - 示例:`(ab)+` 匹配 "ab", "abab" 等 `|` (竖线) - 表示"或"关系 - 示例:`cat|dog` 匹配 "cat" 或 "dog" #### 特殊字符 `\d` - 匹配任意数字,等价于 `[0-9]` `\D` - 匹配任意非数字,等价于 `[^0-9]` `\w` - 匹配任意单词字符(字母、数字、下划线),等价于 `[a-zA-Z0-9_]` `\W` - 匹配任意非单词字符,等价于 `[^a-zA-Z0-9_]` `\s` - 匹配任意空白字符(空格、制表符、换行符等) `\S` - 匹配任意非空白字符 #### 非打印符 | 字符 | 描述 | | :--- | :----------------------------------------------------------- | | \cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 | | \f | 匹配一个换页符。等价于 \x0c 和 \cL。 | | \n | 匹配一个换行符。等价于 \x0a 和 \cJ。 | | \r | 匹配一个回车符。等价于 \x0d 和 \cM。 | | \s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 | | \S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 | | \t | 匹配一个制表符。等价于 \x09 和 \cI。 | | \v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 | ## 5.常用修饰符 #### 1. `i` (ignore case) - 忽略大小写 - 使匹配不区分大小写 - 示例:`/abc/i` 可以匹配 "abc", "Abc", "ABC" 等 - 支持语言:几乎所有正则表达式实现(JavaScript、PHP、Python等) #### 2. `g` (global) - 全局匹配 - 查找所有匹配项,而不是在第一个匹配后停止 - 示例:在字符串 "ababab" 中,`/ab/g` 会匹配所有三个 "ab" - 支持语言:JavaScript、PHP等 #### 3. `m` (multiline) - 多行模式 - 改变 `^` 和 `$` 的行为,使其匹配每行的开头和结尾,而不仅是整个字符串的开头和结尾 - 示例:在多行字符串中,`/^abc/m` 会匹配每行开头的 "abc" - 支持语言:JavaScript、PHP、Python、Perl等 #### 4. `s` (single line/dotall) - 单行模式 - 使点号 `.` 匹配包括换行符在内的所有字符 - 在JavaScript中称为"dotall"模式,使用 `/s` 修饰符 - 示例:`/a.b/s` 可以匹配 "a\nb" - 支持语言:PHP、Perl、Python(作为`re.DOTALL`)、JavaScript(ES2018+) #### 5. `u` (unicode) - Unicode模式 - 启用完整的Unicode支持 - 正确处理UTF-16代理对和Unicode字符属性 - 示例:`/\p{Script=Greek}/u` 可以匹配希腊字母 - 支持语言:JavaScript、PHP等 #### 6. `y` (sticky) - 粘性匹配 - 从目标字符串的当前位置开始匹配(使用`lastIndex`属性) - 类似于`^`锚点,但针对的是匹配的起始位置 - 示例:在JavaScript中,`/a/y` 会从`lastIndex`开始匹配 "a" - 支持语言:JavaScript #### 7. `x` (extended) - 扩展模式 - 忽略模式中的空白和注释,使正则表达式更易读 - 示例:在PHP中,`/a b c/x` 等同于 `/abc/` - 支持语言:PHP、Perl、Python(作为`re.VERBOSE`) ## 6.贪婪与非贪婪量词 默认情况下,量词(`*`, `+`, `?`, `{}`)是贪婪的,会尽可能多地匹配字符。在量词后加`?`可使其变为非贪婪(懒惰)模式: - `*?`:零次或多次,但尽可能少 - `+?`:一次或多次,但尽可能少 - `??`:零次或一次,但尽可能少 - `{n,m}?`:n到m次,但尽可能少 示例:`<.*?>` 匹配HTML标签时不会跨标签匹配 ## 7.断言 断言(Assertion)是正则表达式中用于指定匹配位置的元字符,它们不匹配任何实际字符,而是匹配字符之间的位置。 简单来说,断言就是"条件",它要求目标字符串必须满足某些条件,但不会消耗字符。 #### 断言的特点 1. **零宽度**:不占用匹配字符的位置 2. **条件检查**:只检查是否满足特定条件 3. **不影响匹配结果**:仅作为匹配的约束条件 #### 断言类型 `(?=...)` (正向肯定预查) - 匹配后面跟着特定模式的位置 - 示例:`Windows(?=95|98)` 匹配后面跟着95或98的"Windows" `(?!...)` (正向否定预查) - 匹配后面不跟着特定模式的位置 - 示例:`Windows(?!95|98)` 匹配后面不跟着95或98的"Windows" `(?<=...)` (反向肯定预查) - 匹配前面是特定模式的位置 - 示例:`(?<=95|98)Windows` 匹配前面是95或98的"Windows" `(?<!...)` (反向否定预查) - 匹配前面不是特定模式的位置 - 示例:`(?<!95|98)Windows` 匹配前面不是95或98的"Windows" ## 8.运算符优先级 以下是一些常见正则表达式运算符按照优先级从高到低的顺序: - **转义符号:** `\` 是用于转义其他特殊字符的转义符号。它具有最高的优先级。 示例:`\d`、`\.` 等,其中 `\d` 匹配数字,`\.` 匹配点号。 - **括号:** 圆括号 `()` 用于创建子表达式,具有高于其他运算符的优先级。 示例:`(abc)+` 匹配 "abc" 一次或多次。 - **量词:** 量词指定前面的元素可以重复的次数。 示例:`a*` 匹配零个或多个 "a"。 - **字符类:** 字符类使用方括号 `[]` 表示,用于匹配括号内的任意字符。 示例:`[aeiou]` 匹配任何一个元音字母。 - **断言:** 断言是用于检查字符串中特定位置的条件的元素。 示例:`^` 表示行的开头,`$` 表示行的结尾。 - **连接:** 连接在没有其他运算符的情况下表示字符之间的简单连接。 示例:`abc` 匹配 "abc"。 - **管道:** 管道符号 `|` 表示"或"关系,用于在多个模式之间选择一个。 示例:`cat|dog` 匹配 "cat" 或 "dog"。 ## 9.分组和引用 | 概念 | 语法 | 用途 | | :----------- | :--------------------------- | :--------------------- | | 捕获分组 | `(pattern)` | 捕获匹配内容并分配编号 | | 非捕获分组 | `(?:pattern)` | 分组但不捕获 | | 命名分组 | `(?P<name>pattern)` (Python) | 为分组指定名称 | | 反向引用 | `\1`, `\2` 等 | 引用前面匹配的分组 | | 命名反向引用 | `(?P=name)` (Python) | 按名称引用分组 | | 替换引用 | `$1`, `$2` 或 `\1`, `\2` | 在替换字符串中引用分组 |
学习笔记-正则表达式 - 语法
### 正则表达式语法学习笔记(精简版) --- #### **一、基础元字符** | 元字符 | 描述 | |--------|----------------------------------------------------------------------| | `.` | 匹配任意单个字符(除换行符外) | | `\` | 转义字符,用于匹配特殊字符本身(如 `\.` 匹配 `.`) | | `*` | 匹配前一个字符/子表达式 **0次或多次** | | `+` | 匹配前一个字符/子表达式 **1次或多次** | | `?` | 匹配前一个字符/子表达式 **0次或1次** | --- #### **二、字符类** 1. **普通字符组** - `[abc]`: 匹配 `a`、`b` 或 `c` 中的任意一个字符。 - `[a-z]`: 匹配小写字母 a 到 z 中的任意一个字符。 2. **排除型字符组** - `[^0-9]`: 匹配非数字字符。 3. **预定义字符类** - `\d`: 匹配数字(等价于 `[0-9]`)。 - `\w`: 匹配单词字符(字母、数字、下划线,等价于 `[a-zA-Z0-9_]`)。 - `\s`: 匹配空白字符(空格、制表符、换行符等)。 --- #### **三、量词** | 量词 | 描述 | 示例 | |------------|-------------------------------|--------------------| | `{n}` | 精确匹配 n 次 | `a{3}` → `aaa` | | `{n,}` | 至少匹配 n 次 | `\d{2,}` → 两位及以上数字 | | `{n,m}` | 匹配 n 到 m 次 | `a{2,4}` → `aa`, `aaa`, `aaaa` | | **贪婪模式** | 默认尽可能多匹配(如 `.*`) | | | **非贪婪模式** | 在量词后加 `?`(如 `.*?`) | | --- #### **四、分组与捕获** 1. **分组** - `(exp)`: 将子表达式 `exp` 分组,可用于逻辑操作或量词控制。 - 示例:`(ab)+` → `ababab`。 2. **捕获与非捕获** - 默认分组为捕获组(存储匹配结果)。 - 非捕获组:`(?:exp)`(仅分组,不捕获)。 3. **反向引用** - 使用 `\1`, `\2` 等引用分组内容。 - 示例:`(\w+)\s+\1` → 匹配重复单词(如 `hello hello`)。 --- #### **五、边界匹配** | 符号 | 描述 | 示例 | |------|--------------------------|-----------------------| | `^` | 匹配字符串开始 | `^Hello` → 以 Hello 开头 | | `$` | 匹配字符串结束 | `world$` → 以 world 结尾 | | `\b` | 匹配单词边界 | `\bcat\b` → 匹配独立单词 "cat" | --- #### **六、选择结构** - `|`: 逻辑“或”操作。 - 示例:`cat|dog` → 匹配 `cat` 或 `dog`。 --- #### **七、修饰符(Flags)** | 修饰符 | 描述 | 常见语言支持 | |--------|---------------------------|-----------------------| | `i` | 不区分大小写 | JavaScript/Python/Java | | `g` | 全局匹配(查找所有结果) | JavaScript | | `m` | 多行模式(`^` 和 `$` 匹配每行的首尾) | Python/JavaScript | --- #### **八、应用场景示例** 1. **邮箱验证** ```regex ^[\w.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4}$ ``` 2. **提取电话号码** ```regex (\d{3})-(\d{8}) # 匹配格式如 010-12345678 ``` 3. **HTML标签过滤** ```regex <[^>]+> # 匹配所有HTML标签 ``` --- #### **九、注意事项** 1. **性能优化** - 避免过度使用贪婪量词(如 `.*`),防止回溯爆炸。 2. **可读性** - 复杂正则可拆分为多行并添加注释(部分语言支持)。 3. **兼容性** - 不同编程语言的正则实现可能略有差异(如修饰符名称)。 --- **工具推荐**:使用 [Regex101](https://regex101.com/) 或 [RegExr](https://regexr.com/) 在线测试正则表达式。
正则表达式
在日常开发中,熟练使用`正则表达式`可以极大的提升我们的开发效率。并且`正则表达式`在每个语言中都是可以使用的,就像 `JSON`一样。 在日常开发中,了解和掌握一些常用正`则表达式`能极大提高开发效率,就比如: - 字符串的匹配 - 表单项的格式校验 小扶就以前端为例,分享一些可能会用到的`正则表达式`,希望能给大家带来一些帮助。 ## 1、手机号码的校验 ``` const phoneReg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/ const phoneStr1 = '18886233487' console.log(phoneReg.test(phoneStr1)) // true const phoneStr2 = '17283017203897' console.log(phoneReg.test(phoneStr2)) // false ``` ## 2、身份证的校验 ``` const sfzReg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ const sfzStr1 = '415106199801012130' console.log(sfzReg.test(sfzStr1)) // true const sfzStr2 = '718381298381212183' console.log(sfzReg.test(sfzStr2)) // false ``` ## 3、邮箱的校验 ``` const emailReg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/ const emailStrWY = '956666@163.com' // 163邮箱 const emailStrQQ = '956666@qq.com' // qq邮箱 console.log(emailReg.test(emailStrWY)) // true console.log(emailReg.test(emailStrQQ)) // true const noEmail = '72873213.com' console.log(emailReg.test(noEmail)) // false ``` ## 4、URL的校验 ``` const urlReg = /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ const urlStr1 = 'https://haha.dogfu.top/xxx/xxx' console.log(urlReg.test(urlStr1)) // true const urlStr2 = 'sss://haha.dogfu.top/xxx/xxx' console.log(urlReg.test(urlStr2)) // false ``` ## 5、IPv4的校验 ``` const ipv4Reg = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ const ipv4Str1 = '122.12.56.65' console.log(ipv4Reg.test(ipv4Str1)) // true const ipv4Str2 = '122.12.56.655' console.log(ipv4Reg.test(ipv4Str2)) // false ``` ## 6、16进制颜色的校验 ``` const color16Reg = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ const color16Str1 = '#fff' console.log(color16Reg.test(color16Str1)) // true const color16Str2 = '#1234567' console.log(color16Reg.test(color16Str2)) // false ``` ## 7、日期 YYYY-MM-DD ``` const dateReg = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/ const dateStr1 = '2021-10-10' console.log(dateReg.test(dateStr1)) // true const dateStr2 = '2021-01-01 1' console.log(dateReg.test(dateStr2)) // false ``` ## 8、日期 YYYY-MM-DD hh:mm:ss ``` const dateReg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/ const dateStr1 = '2021-10-10 16:16:16' console.log(dateReg.test(dateStr1)) // true const dateStr2 = '2021-10-10 16:' console.log(dateReg.test(dateStr2)) // false ``` ## 9、整数的校验 ``` const intReg = /^[-+]?\d*$/ const intNum1 = 12345 console.log(intReg.test(intNum1)) // true const intNum2 = 12345.1 console.log(intReg.test(intNum2)) // false ``` ## 10、小数的校验 ``` const floatReg = /^[-\+]?\d+(\.\d+)?$/ const floatNum = 1234.5 console.log(floatReg.test(floatNum)) // true ``` ## 11、保留n位小数 ``` function checkFloat(n) { return new RegExp(`^([1-9]+[\d]*(.[0-9]{1,${n}})?)$`) } // 保留2位小数 const floatReg = checkFloat(2) const floatNum1 = 1234.5 console.log(floatReg.test(floatNum1)) // true const floatNum2 = 1234.55 console.log(floatReg.test(floatNum2)) // true const floatNum3 = 1234.555 console.log(floatReg.test(floatNum3)) // false ``` ## 12、邮政编号的校验 ``` const postalNoReg = /^\d{6}$/ const postalNoStr1 = '522000' console.log(postalNoReg.test(postalNoStr1)) // true const postalNoStr2 = '5220000' console.log(postalNoReg.test(postalNoStr2)) // false ``` ## 13、QQ号的校验 说明:5-11位数字 ``` const qqReg = /^[1-9][0-9]{4,10}$/ const qqStr1 = '1915801633' console.log(qqReg.test(qqStr1)) // true const qqStr2 = '191580163333' console.log(qqReg.test(qqStr2)) // false ``` ## 14、微信号的校验 说明:6至20位,以字母开头,字母,数字,减号,下划线 ``` const wxReg = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/ const wxStr1 = 'xiaofu55279' console.log(wxReg.test(wxStr1)) // true const wxStr2 = '厉害了我的vx' console.log(wxReg.test(wxStr2)) // false ``` ## 15、车牌号的校验 ``` const carNoReg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/ const carNoStr1 = '粤A12345' console.log(carNoReg.test(carNoStr1)) // true const carNoStr2 = '广东A12345' console.log(carNoReg.test(carNoStr2)) // false ``` ## 16、只含字母的字符串 ``` const letterReg = /^[a-zA-Z]+$/ const letterStr1 = 'xiaofu' console.log(letterReg.test(letterStr1)) // true const letterStr2 = 'xiaofu_chu' console.log(letterReg.test(letterStr2)) // false ``` ## 17、包含中文的字符串 ``` const cnReg = /[\u4E00-\u9FA5]/ const cnStr1 = '我是xiaofu,扶非凡' console.log(cnReg.test(cnStr1)) // true const cnStr2 = 'xiaofu_chu' console.log(cnReg.test(cnStr2)) // false ``` ## 18、密码强度的校验 说明:密码中必须包含字母、数字、特称字符,至少8个字符,最多30个字符 ``` const passwordReg = /(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,30}/ const password1 = 'xiaofu_chu12345..' console.log(passwordReg.test(password1)) // true const password2 = 'xiaofuchu12345' console.log(passwordReg.test(password2)) // false ``` ## 19、字符串长度n的校验 ``` function checkStrLength(n) { return new RegExp(`^.{${n}}$`) } // 校验长度为3的字符串 const lengthReg = checkStrLength(3) const str1 = 'hhh' console.log(lengthReg.test(str1)) // true const str2 = 'hhhhh' console.log(lengthReg.test(str2)) // false ``` ## 20、文件拓展名的校验 ``` function checkFileName (arr) { arr = arr.map(name => `.${name}`).join('|') return new RegExp(`(${arr})$`) } const filenameReg = checkFileName(['jpg', 'png', 'txt']) const filename1 = 'xiaofu.jpg' console.log(filenameReg.test(filename1)) // true const filename2 = 'xiaofu.png' console.log(filenameReg.test(filename2)) // true const filename3 = 'xiaofu.txt' console.log(filenameReg.test(filename3)) // true const filename4 = 'xiaofu.md' console.log(filenameReg.test(filename4)) // false ``` ## 21、匹配img和src ``` const imgReg = /<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/ig const htmlStr = '<div></div><img src="xiaofu.png" /><img src="xiaofu111.png" />' console.log(imgReg.exec(htmlStr)) // [ // '<img src="xiaofu.png" />', // 'xiaofu.png', // index: 11, // input: '<div></div><img src="xiaofu.png" /><img src="xiaofu111.png" />', // groups: undefined // ] console.log(imgReg.exec(htmlStr)) // [ // '<img src="xiaofu111.png" />', // 'xiaofu111.png', // index: 37, // input: '<div></div><img src="xiaofu.png" /><img src="xiaofu111.png" />', // groups: undefined // ] ``` ## 22、匹配html中的注释 ``` const noteReg = /<!--(.*?)-->/g const htmlStr = '<!--一个div标签--> <div></div> <!--一个div标签--> <div></div>' console.log(noteReg.exec(htmlStr)) // [ // '<!--一个div标签-->', // '一个div标签', // index: 0, // input: '<!--一个div标签--> <div></div> <!--一个div标签--> <div></div>', // groups: undefined // ] console.log(noteReg.exec(htmlStr)) // [ // '<!--一个div标签-->', // '一个div标签', // index: 27, // input: '<!--一个div标签--> <div></div> <!--一个div标签--> <div></div>', // groups: undefined // ] ``` ## 23、匹配html中的style ``` const styleReg = /style="[^=>]*"([(\s+\w+=)|>])/g const htmlStr = '' console.log(styleReg.exec(htmlStr)) // [ // 'style="background:#000;">', // '>', // index: 5, // input: '', // groups: undefined // ] console.log(styleReg.exec(htmlStr)) // [ // 'style="color:#fff">', // '>', // index: 36, // input: '', // groups: undefined // ] ``` ## 24、匹配html中的颜色 ``` const colorReg = /#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/g const htmlStr = '' console.log(colorReg.exec(htmlStr)) // [ // '#000', // '000', // index: 23, // input: '', // groups: undefined // ] console.log(colorReg.exec(htmlStr)) // [ // '#fff', // 'fff', // index: 49, // input: '', // groups: undefined // ] ``` ## 25、匹配htmlTag(html标签) ``` const endReg = /<("[^"]*"|'[^']*'|[^'">])*>/g const htmlStr = '<div style="background:#000;"><span style="color:#fff"></span></div><h1></h1>' console.log(endReg.exec(htmlStr)) console.log(endReg.exec(htmlStr)) console.log(endReg.exec(htmlStr)) console.log(endReg.exec(htmlStr)) console.log(endReg.exec(htmlStr)) console.log(endReg.exec(htmlStr)) ``` ## 结语 如果你觉得此文对你有一丁点帮助,欢迎到[小扶的博客](http://dogfu.top/#/article?id=41),点个赞,鼓励一下小扶嘿嘿。
正则大全
地址:https://any86.github.io/any-rule/
《精通正则表达式》(第三版)
地址:https://www.aliyundrive.com/s/mnagR7Xz8xo
正则表达式RegExp
地址:https://www.bilibili.com/video/BV1Qh411B7wP?spm_id_from=333.999.0.0
iHateRegex
是不是常常因为找不到合适的表达式,深恶痛绝。开源作者痛恨正则,决定搞一个正则表达式备忘录,开发了一个正则表达式搜索网站。 地址:https://github.com/geongeorge/i-hate-regex
uap-csharp
基于.net后台的正则表达式库 地址:https://github.com/ua-parser/uap-csharp/
RegexOne
地址:https://regexone.com/
在线正则表达式测试
地址:https://tool.oschina.net/regex/
