在JS中有多种内置方法可以使用正则表达式,比如说match,exec,test等
文章参考 第十四章 吃通js正则表达式,javascript前端工程师必会技能_哔哩哔哩_bilibili
目录
1 正则常用方法
1.1 exec的简单使用
1.1.1 基本使用
1.1.2 lastIndex属性
1.1.3 y模式
1.2 match的简单使用
1.3 test的简单使用
1.4 matchAll的简单使用
2 创建正则表达式对象
3 正则字符串内容
3.1 竖杠
3.2 括号
3.2.1 基本使用
3.2.2 数字表示括号
3.2.3 部分方法中代替括号
3.2.4 不记录组
3.2.5 给组起名
3.3 中括号
3.3.1 基本用法
3.3.2 横杠
3.4 点
3.5 加号
3.6 星号
3.7 尖号
3.7.1 开头标志
3.7.2 取反
3.8 美元符号
3.8.1 字符结尾
3.8.2 匹配内容前方,后方与本身
3.9 大括号
3.10 问号
3.10.1 0个或一个
3.10.2 禁止贪婪
3.11 右斜杠
3.11.1 将特殊字符转义为普通字符
3.11.2 数字
3.11.3 除了数字以外的所有字符
3.11.4 空白
3.11.5 除了空白以外的所有字符
3.11.6 字母,数字,下划线
3.11.7 除了字母,数字,下划线的所有字符
4 匹配模式
4.1 全局模式 g
4.2 不区分大小写模式 i
4.3 单行模式 s
4.4 字符属性模式
4.5 其他不常用的模式
5 一些例子
5.1 多行字符串转变为数组套对象
6 多个正则表达式匹配一个字符
7 断言匹配
7.1 确定后面是什么的断言匹配
7.2 确定前面是什么的断言匹配
7.3 后面不是什么的断言匹配
7.4 前面不是什么的断言匹配
1 正则常用方法
1.1 exec的简单使用
exec可以用于检索字符串中正则表达式的匹配,如果没有匹配会返回null
1.1.1 基本使用
我们在hello中寻找o
如果你匹配不到就会返回null
如果你在hello world中找l
你会获得index为2的l,也就是第0个l
我当前只想获取hello中的第二个l,那么我们可以这样写
数组的第一个值是从哪里找到的,第二个值是找到的l。首先找到的是hello,hello在hello world从第0位开始,所以index是0
如果你找的是world中的l,就这样写
这样得到的索引就是6
1.1.2 lastIndex属性
我们依然在hello world中找l,我们连续执行多次exec(),会发现指定的结果不一样
这里exec使用了正则对象的lastIndex属性,我们打印出来看一下
第一次从开始找,所以lastIndex是0,第二次找到的索引为2的l,所以下一次的lastIndex就是3,直到最后null的时候归零
- 不加入全局模式(g)的时候,lastIndex永远是0
- 可以自己定义lastIndex,从而控制从哪里开始找
1.1.3 y模式
y模式与g模式都是全局模式,g模式会在全局一直找,y模式当找到一个不是的就从头开始找
我们对比着看一下,先看g模式
g模式可以找到第三个l,我们再看y模式
y模式可以找到前面两个l,ll的后面是o,不符合正则的要求了,之后y模式就会再次从头找
1.2 match的简单使用
match在这里提到过 4.字符串型 string_Suyuoa的博客-CSDN博客 ,参数直接使用正则字符串
如果是全局搜索数组会有变化
1.3 test的简单使用
test用于检测字符串中有没有正则字符串中要的东西
如果有就是true
如果没有就是false
1.4 matchAll的简单使用
matchAll()必须配合g使用,结果会返回一个迭代器对象,遍历整个迭代器会得到每一个符合字符串的具体信息
在有的低版本浏览器中不支持matchAll,可以通过match实现matchAll,具体方法可以看一下这个,逻辑大致是用match先找一个,之后用其他的字符替换掉找到的字符,然后继续找,这样一个一个找就能找到最后了 35 为低端浏览器定义原型方法matchAll_哔哩哔哩_bilibili
也可以使用exec()与exec()带的属性lastIndex实现matchAll,具体方法可以看一下这个 36 使用exec完成全局匹配_哔哩哔哩_bilibili
2 创建正则表达式对象
可以用new RegExp()来创建正则表达式对象,第一个参数是正则表达式的内容,第二个参数是模式(g是全局模式)
3 正则字符串内容
3.1 竖杠
竖杠|表示 或 的意思
找到hello中的所有e和o
3.2 括号
3.2.1 基本使用
括号表示分组的意思,学名叫原子组,我们先看个例子
如果没分组的话就是 010 或 020\-\d{7,9}
- -\d{7,9}是后面有一个横杠然后接7-9个数字
如果加了分组就是在字符串中 含有010或020,然后后面接一个横杠然后接7-9个数字
这样就是false了
3.2.2 数字表示括号
我们用\数字可以替代第几个括号
- 上面的\1就代表h[1-6]
这样就可以匹配到上面的三个标题标签了
如果不进行全局搜索,结果会包含括号中的内容
3.2.3 部分方法中代替括号
在部分方法中也可以用$数字来代表第几组括号,比如下面把所有的h标签替换成p标签
如果使用函数可以传递自定义参数,自定义参数依次就是这些
第一个是完全找到的字符,之后是括号中的字符,之后是索引,然后是输入内容
我没有给返回值所以页面上显示的是undefined
给返回值就好了
会出现括号套括号的情况,你的索引情况是,外层的括号在前面,内层的括号在后面,比如下面这种情况就是 红括号索引<绿括号索引<蓝括号索引
3.2.4 不记录组
可以在括号内的最前部加上?: 表示不记录哪一组
但是在这个例子中不可以不记录第一组
3.2.5 给组起名
?<名称>命名,$<名称>调用
这样就会将匹配的内容换成第二个l
如果使用match方法会在结果中的group属性看到命名的组
3.3 中括号
3.3.1 基本用法
中括号内无论写多少内容都代表一个字符,中括号内所有字符呈 或 的关系
下面这个例子是在 192695348 找到 123456 中的任何一个字符
中括号中的特殊字符只表示其本身的意思
3.3.2 横杠
横杠表示跨度,横杠常于中括号配合,比如[A-Z]就是大写字母,[0-9]就是所有数字
- 只能升序写,比如[9-0]这样写是无效的
如果要匹配数字或小写字母可以这样写 [0-9a-z]
3.4 点
点可以代表除换行外的任意字符
3.5 加号
加号可以表示加号前的一个字符重复一次或多次
我们把l+看做一个整体
3.6 星号
星号可以表示星号前的一个字符重复0次或多次
我们把3*看做一个整体
3.7 尖号
3.7.1 开头标志
尖号表示以下一个字符为开始的字符
如果不加尖号就是查询字符串中有没有123
如果加了尖号则代表必须以123开头,结果才能为true
如果尖号在中括号中是取非的意思,下面这个例子就是除了123的所有字符
3.7.2 取反
在中括号内如果加上尖号表示取反
如果不加尖号表示找到所有的l,如果加上尖号表示找到除了l的所有字符
3.8 美元符号
3.8.1 字符结尾
$符号表示必须以$前的字符结尾
如果123不在结尾就会返回false
3.8.2 匹配内容前方,后方与本身
用$`来代替匹配内容前面的内容,$'来替代匹配内容后面的内容,\$&来匹配内容本身的内容
- `是ESC下面的按键,'是单引号
匹配到第一个l,将第一个l替换为 $&(本身)+哈哈哈
匹配到第一个l,将第一个l替换为$`(第一个l之前的内容,也就是he)+哈哈哈
匹配到第一个l,将第一个l替换为$'(第一个l之后的内容,也就是lo)+哈哈哈
3.9 大括号
大括号表示后面跟几个上一个类型的
比如下面检测字符串中,字符b到字符末尾,是否只存在3-5个数字
如果多加了几个数字就为false
大括号一般不在最后写,如果在最后写就表明字符b的后面有没有3-5个数字,如果数字比5个多也会判断为true
如果比3个少就是false了
可以不给逗号及逗号后面值,让其匹配固定个数
如果使用match会按照你给的最大数量进行匹配,在下面这个例子中并不会只匹配一个就停止
逗号后面可以不给值,不给值在这个例子中就表示一个到无数个
3.10 问号
3.10.1 0个或一个
问号表示前面的字符可以有也可以没有(0个或1个)
比如我现在有两个url,一个是http协议,一个是https协议,这两种协议我们都能接收,所以就可以这样写
3.10.2 禁止贪婪
默认情况下会尽可能多的进行匹配
就是你写3到6个,它会给你匹配6个而不是匹配3个
在表示范围的后面加一个问号就只会匹配3个而不是匹配6个
除了大括号,星号,加号这种表示数量的符号加上问号后都会尽可能少的匹配
3.11 右斜杠
右斜杠代表转义字符
3.11.1 将特殊字符转义为普通字符
比如我想找到(1234)中的括号,这个时候就得在括号前加一个右斜杠
3.11.2 数字
\d代表数字
3.11.3 除了数字以外的所有字符
\D代表除了数字以外的所有字符
3.11.4 空白
用\s表示空白。空格,制表符,换行符都算是空白
123后面我敲了一个tab,345后面我敲了两个空格
3.11.5 除了空白以外的所有字符
用\S表示除了空白以外的所有字符。空格,制表符,换行符都算是空白
3.11.6 字母,数字,下划线
用\w表示字母,数字,下划线
3.11.7 除了字母,数字,下划线的所有字符
用\W表示除了字母,数字,下划线的所有字符
4 匹配模式
匹配的模式可以混着用,也可以单独用
4.1 全局模式 g
现在我们想找到字符串里的所有数字,那么像下面这样写就只会找到第一个数字
在正则的内容最后加上g可以进行全局搜索
这样就可以找到所有要找的字符了
4.2 不区分大小写模式 i
如果不添加i只能找到指定的字符
如果添加了i就是不区分大小写
4.3 单行模式 s
点是不能匹配换行符的,使用单行模式就会将换行符当成一个普通的字符进行匹配
4.4 字符属性模式
我做个例子
这里面要替换的只有大括号中的L,具体换成什么可以参考这个 正则表达式系列之 —— Unicode:修饰符 "u" 和类 \p{...}_LeviDing的博客-CSDN博客
有几个常用的
- 中英文 L
- 标点符号 P
- 中文 sc='Han'
还有就是宽字符的时候需要用到u
4.5 其他不常用的模式
- m 每一行单独处理
- y 发现不对就从头开始模式,在上面的exec中介绍过
5 一些例子
5.1 多行字符串转变为数组套对象
6 多个正则表达式匹配一个字符
我现在有两个条件
- 输入内容必须以字母或数字开头,且数字和字母为5-10位
- 输入内容中必须包含大写字母
- 可以在regs数组中加入若干个正则条件
如果输入的值不符合就会显示错误
符合就会显示正确
7 断言匹配
7.1 确定后面是什么的断言匹配
我们现在想找到l后紧跟一个d的l
7.2 确定前面是什么的断言匹配
我们想找到hello world中前面是r的l
- 注意(?<=r)要写在前面不要写在后面
7.3 后面不是什么的断言匹配
我们现在想找到后面不是空格的o字符
7.4 前面不是什么的断言匹配
我们现在找前面不是l的o