本文的目的是帮助快速掌握正则表达式 -- 本文使用使用 vscode 的搜索功能来帮助理解(在vscode 的文件页使用 ctrl + f 打开搜索框)
最基础的用法
限定符
问号 -- ?
下图中表示在 “Metpoid” 这个单词中 ,? 前的 d 字符出现0 次或 1 次, 简单来讲就是 d 可有可无。
// 图中不管是 “Metpoid” 还是 “metpoi” 都可以匹配
星号 -- *
下图中使用星号 * 表示, * 前的字符 s 可以出现 0 次或者多次
可以看到,此次匹配了 test , tesssst , 甚至 tet , 但是没有匹配 text ,这是因为我们规定了,在字符 e 和字符 t 之间的字符 s 出现次数。
加号 -- +
加号与星号不同的地方在于,加号匹配出现一次或以上的字符
这里把之前的星号 * 改成加号 + ,可以看到 tet 没有被匹配 , 因为 s 一次都没有出现。
花括号 -- {}
花括号 {} 可以用来精确匹配 , 比如想要匹配一个字符出现了 4 次 , 可以在花括号内写上 {4}:
或者想要匹配一个区间, 比如 2 - 5 之间 , 可以在花括号内写上 {2,5}
或者想要匹配 出现 2 次或 2 次以上的 字符 , 可以在花括号内写上 {2,}
通配符到这里就基本结束了, 不过以上的通配符都是匹配单个字符,以下是通配符使用技巧
限定符使用技巧
匹配多个限定字符,使用括号 ()
使用 () + ?
使用 () + +
使用 () + {}
正则中的 “或” |
|
你可以这样去表达"或" , 下面的式子表示,先匹配 t 然后匹配 t 后面的空格,再去匹配括号里的 es 或 ex (这里的括号表示隔开 es 与 ex , 如果去掉括号就表示隔开 t es 与 ex)
在空格后加上 ? 对比理解
去掉括号的对比
可以看到,匹配的字符变换为 t es 或者 ex
字符类
[]
[] 字符集合。陪陪所包含的任意一个字符,例如:[abc] 可以匹配 "plan" 中的 "a"
[] 还可以用来全字匹配
[a-z] 表示所有的小写字符,[A-Z] 表示所有的大写字符, [0-9] 表示所有的数字
[] 也可以用来匹配中文 或者汉字 , 使用 [\u4e00-\u9fa5] 匹配中文, 或者 [^\x00-\xff] 匹配双字节字符。
^ 脱字符
^ 单独使用可以用来匹配输入字符串的开始位置。
如果在 [] 内使用 ^ 则代表匹配除了尖号后面列出的“以外”的字符
比如 [^0-9] 表示匹配所有的非数字字符,包括换行符。
元字符
正则表达式中大部分元字符都以反斜杠开头
- \d 代表匹配一个数字字符。等价于 [0-9]。
- \D 代表非数字字符。
- \w 代表单词字符,即所有的英文字符,数字,和下划线。
- \W 代表非单词字符。
- \s 代表空白符,匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。
- \S 代表非空白字符。
- . 匹配除换行符(\n、\r)之外的任何单个字符。
- ^ 匹配输入字符串的开始位置。
- $ 匹配输入字符串的结束位置。
- \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
贪婪与懒惰匹配(Greedy vs Lazy Match)
这里以html标签为例
贪婪匹配
懒惰匹配
字符 ? :如果紧跟在任何量词 + * ? 或 {} 的后面,将会使量词变为非贪婪(懒惰匹配,匹配尽量少的字符) , 和缺省使用的的贪婪模式(匹配尽可能多的字符) 正好相反。
关于上例html标签例子的解析:
贪婪匹配: <.+> 表示匹配符号 "<" 和符号 ">" 之间的任意字符,且任意字符大于0 , 因为是尽可能多的匹配,所以当匹配的时候发现整个标签
"< div >Metpoid created this component.</ div >"
是符合要求的,所以就是匹配所有。
懒惰匹配:<.+?> 表示匹配符号 "<" 和符号 ">" 之间的任意字符,且任意字符大于0 , 因为是尽可能少的匹配,所以当匹配的时候发现标签 < template > 已经是符合要求的,所以会匹配< template > 标签,然后继续向下匹配,发现 < div > 也是符合要求的,以此重复下去,所以最后匹配 < template >< div ></ div ></ template > 四个标签。
例子:匹配颜色
先来看一下一个标准的白色:
#ffffff
以及黑色
#000000
还有两种灰色:
#aaaaaa 和 #999999
首先可以匹配井号 # :
#
我们知道,每一个颜色值的字符都是十六进制,因此他们的取值在 a-f 或 大写的 A-F 以及 0-9 之间:
#[a-fA-F0-9]
字符都需要出现六次:
#[a-fA-F0-9]{6}
以及字符只能出现最多六次,使用边界符 \b 来区分不符合条件的字符:
#[a-fA-F0-9]{6}\b
例子:匹配 IP 地址
ip 地址一般由四位数组组成,数字之间使用 . 隔开
例如:
127.0.0.1 | 255.255.255.255 | 1.0.0.1
分析:
首先,ip地址的每一段数字都是八位二进制数字,即每一位取值都在0-255 之间,所以每一位的取值是这样的:
(25[0-5]|2[0-4]\d|[01]\d\d)
这里分为三种情况:
- 百位数与十位数为 25 时 , 个位数只能在 0-5 之间取值。25[0-5]
- 百位数为 2 时, 十位数可以在 0-5 之间取值,个位数可以在 0-9 之间取值。 2[0-4]\d
- 百位数为0-1 时,十位数和个位数都可以在 0-9 之间取值。 [01]?\d\d?
然后,我们为前三位数字加上 .
(25[0-5]|2[0-4]\d|[01]\d\d)\.
(这里的 \. 就是字面上的 . ,是 . 的转义符)
由于 ip 地址的每一部分都可以用两位数字构成,甚至是一位数字,所以,可以在第三种情况的个位(十位也可以)和百位后加上 ? , 这样就可以表示这种情况了。
(25[0-5]|2[0-4]\d|[01]\d?\d?)\.
这样的匹配要进行三次,以此来表示三位数字:
((25[0-5]|2[0-4]\d|[01]\d?\d?)\.){3}
第四位数字,只需要将匹配第一段数字的部分复制就可以了:
((25[0-5]|2[0-4]\d|[01]\d?\d?)\.){3}(25[0-5]|2[0-4]\d|[01]\d?\d?)
最后在正则句子的首位加上边界符 \b 来过滤掉不符合要求的字段
完整正则句子:
\b((25[0-5]|2[0-4]\d|[01]\d?\d?)\.){3}(25[0-5]|2[0-4]\d|[01]\d?\d?)\b
到这里,正则的基本使用方法就差不多结束了,如果想要深入研究的话,这里分享一个正则测试网站:regex101.com
以及学习网站:runoob.com
或者直接来点儿MDN?
github--关于正则
====本文旨在记录与分享====