Skip to content
本页目录

拆分

对于一门语言的掌握程度怎么样, 可以用两个角度来衡量: 读和写

如何能正确地把一大串正则拆分成一块一块的, 成了破解"天书"的关键

一、结构和操作符

  • 结构
结构说明
字面量匹配一个具体字符, 包括不用转义和需要转义的。比如 a匹配字符 "a", \n匹配换行符, \.匹配小数点
字符组匹配一个字符, 可能是多种可能之一
量词表示一个字符连续出现次数
匹配一个位置, 而不是字符
分组用括号表示一个整体
分支多个子表达式多选一
  • 操作符
操作符描述操作符优先级
转义符\1
括号和方括号(…)(?:…)(?=…)(?!…)[…]2
量词限定符{m}{m,n}{m,}?*+3
位置和序列^\元字符、一般字符4
管道符竖杠5

二、注意要点

匹配字符串整体问题

要匹配的目标字符串abcbcd

一不小心就写成/^abc|bcd$/, 应该修改成/^(abc|bcd)$/

量词连缀问题

要匹配的字符串要求:

  • 每个字符为"a"、"b"、"c"任选其一
  • 字符串的长度为 3 的倍数

写成/^[abc]{3}+/, 这样子会报错, 说+前面没有什么可重复的, 应该修改成 /([abc]{3})+/

元字符转义问题

所谓元字符, 就是正则中有特殊含义的字符

包括^、$、.、*、+、?、|、\、/、(、)、[、]、{、}、=、!、:、- ,

当匹配到上面字符时, 可以一律转义

js
const regex = /\^\$\.\*\+\?\|\\\/\[\]\{\}\=\!\:\-\,/;
const string = "^$.*+?|\\/[]{}=!:-,";
console.log( regex.test(string) ); // true
  1. 字符组中的元字符 跟字符组相关的元字符[]^-在产生歧义的地方进行转义, 例如开头的^必须转义, 不然整个字符组被看成反义字符组
js
const regex = /[\^$.*+?|\\/\[\]{}=!:\-,]/g;
const string = "^$.*+?|\\/[]{}=!:-,";
console.log( string.match(regex) ); // ["^", "$", ".", "*", "+", "?", "|", "\", "/", "[", "]", "{", "}", "=", "!", ":",
"-", ","]
  1. 匹配 [abc]{3,5} 通过/\[abc]/ 实现转义, 将第一个方括号转义后, 后面的方括号构不成字符组, 从而避免歧义

通过/\{3,5}/ 进行转义

  1. 其余情况

比如 =、!、:、-、, 等符号,只要不在特殊结构中,并不需要转义。

但是,括号需要前后都转义的,如 /\(123\)/

至于剩下的 ^、$、.、*、+、?、|、\、/ 等字符,只要不在字符组内,都需要转义的。

三、案例

身份证

/^(\d{15}|\d{17}[\dxX])$/

IPV4

/^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])$/

拆分结构为((...)\.)3(...)

其中两个(...)是一样的结构, 用于匹配三位数字, 那么整个的结构为三位数.三位数.三位数.三位数