正则表达式的作用
正则表达式描述了字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,将匹配的子串做替换或者从某个串中取出符合某个条件的子串等
正则表达式都能帮我们做什么
- 数据隐藏(188****3456)
- 数据采集
- 数据过滤
- 数据验证
JS标准库中的正则对象
创建正则表达式
- 字面量方式声明正则对象
var t = 'hosifhoaow8923u84'; var reg = /8/; reg.test(t);
- 使用构造函数创建正则对象
var t = 'hosifhoaow8923u84'; var reg = new RegExp('8'); reg.test(t);
二者的使用方法是一致的,不同的是,使用字面量创建正则表达式是在编译时新建正则表达式;而使用构造函数创建正则表达式是在运行时新建正则表达式。
匹配模式(修饰符)
匹配模式表示正则匹配的附加规则,放在正则模式的最尾部。
修饰符可以单个使用,也可以多个一起使用
正则中最常用的匹配模式有以下两种模式:
-
g(global的缩写),代表全局匹配,匹配出所有满足条件的结果。不加 g 表示在第一次匹配成功后,正则对象就停止向下匹配
let text = "cat,bat,sat,fat"; // 使用字面量 let pattern1 = /.at/g pattern1.test(text); // true // 使用构造函数 let parrern2 = new RegExp(".at","g"); parrern2.test(text); // true
-
i(ignore的缩写),代表忽略大小写。匹配时,会自动忽略字符串的大小写。
let text = "cAt,bAt,sAt,fAt"; // 使用字面量 let pattern1 = /.at/gi; pattern1.test(text); // true // 使用构造函数 let parrern2 = new RegExp(".at","gi"); parrern2.test(text); // true
正则对象的方法
test(str)
判断字符串中是否具有指定模式的子串,返回结果是一个布尔类型的结果let text = "cAt,bAt,sAt,fAt"; let parrern2 = /.at/gi; parrern2.test(text); // true
exec(str)
:返回字符串中指定模式的子串,一次只能或一个与之匹配的结果。let text = "cAt,bAt,sAt,fAt"; let parrern2 = /.at/gi; parrern2.exec(text); // 'cAt'
子表达式
在正则表达式中,通过一对圆括号括起来的内容,就叫子表达式
let reg = /\d(\d)\d/gi; // 其中被圆括号括起来的第二个 \d 就是整个表达式的子表达式
捕获
在正则表达式中,当子表达式匹配到内容时,系统就会将子表达式匹配到的内容放入系统的缓存区中。这个行为就叫做捕获。
反向引用
在正则表达式中,可以使用\n
(n>0,正整数,代表系统中的缓冲区编号,它的数值对应着第几个子表达式)来获取缓冲区中的内容,这个过程就叫做反向引用。
let reg = /(\d)(\d)\1\2/;
/*
在上面的正则表达式中
\1 对应着第一个括号中 \d 捕获到的内容。
\2 对应着第二个括号中 \d 捕获到的内容。
*/
注意:一个子表达式捕获的内容只对应在一个缓存区中,如果一个子表达式,再次捕获一个内容,缓存区只存放最新捕获到的内容
String对象的方法
String对象中有些方法中需要使用 正则表达式
作为参数:
- search(reg): 与 indexOf 非常相似,返回指定模式的子串在字符串中首次出现的位置
let text = "cAt,bAt,asat,fAt"; let sea = text.search(/.at/gi); console.log(sea); // 10
- match(reg): 以数组的形式返回指定模式的字符串
let text = "cAt,bAt,asat,fAt"; let sea = text.match(/.at/gi); console.log(sea); // [ 'cAt', 'bAt', 'sat', 'fAt' ]
- replace(reg, ‘替换后的字符’): 把指定模式的子串进行替换操作
let text = "cAt,bAt,asat,fAt"; let sea = text.replace(/.at/g,'嘚嘚一嘚嘚'); console.log(sea); // cAt,bAt,a嘚嘚一嘚嘚,fAt
- split(reg): 以指定模式分割字符串,返回结果为数组
let text = "cAt,bAt,asat,fAt"; let sea = text.split(/,/g); console.log(sea); // [ 'cAt', 'bAt', 'asat', 'fAt' ]
编写正则表达式
正则表达式组成
正则表达式是由普通字符以及特殊字符(元字符)组成的文字模式,正则表达式作为一个模板,将某个字符模式与所要搜索的字符串进行匹配
编写正则表达式的三个步骤:
- 查什么
- 查多少
- 从哪儿查
查什么(匹配符)
字符簇
[]
:查找在一个范围内的内容,匹配时,只能匹配到某个范围中固定的结果
如 [a-z]
: 代表小写字母a
到z
中的某一个。
[1-9]
: 代表数字1
到9
之间的任意一个数字
在字符簇中,通过一个^
来表示取反的含义
如:[^a-z]
: 匹配除了小写字母a
到z
之外的任意一个。
几个常用的特殊的匹配符
字符簇 | 含义 |
---|---|
\d | 匹配一个数字字符,与使用[0-9]等价 |
\D | 匹配一个非数字字符,与使用[^0-9]等价 |
\w | 匹配包括下划线的任何字母、数字、下划线字符,与[0-9a-zA-Z_]等价 |
\W | 匹配任何非字母、数字、下划线字符,与[^\w]等价 |
\s | 匹配任何空白字符 |
\S | 匹配任何非空白字符,与使用[^\s] |
. | 匹配除 ‘\n’(回车符) 之外的任何单个字符 |
[\u4e00-\u9fa5] | 匹配中文字符中的任一字符 |
查多少(限定符)
限定符的作用是指定正则表达式的一个给定字符必须要出现多少次才能满足匹配
字符 | 含义 |
---|---|
* | 匹配前面的子表达式零次或多次,0至多 |
+ | 匹配前面的子表达式一次或多次;1至n |
? | 匹配前面的子表达式零次或一次;0至1 |
{n} | 匹配确定的 n 次 |
{n,} | 至少匹配 n 次 |
{n,m} | 最少匹配 n 次且最多匹配 m 次 |
从哪儿查(定位符)
可以将一个表达式固定在一行的开始或结尾;也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式
字符 | 含义 |
---|---|
^(脱字符) | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
\b | 匹配一个单词边界 |
\B | 匹配非单词边界 |
注意:^
脱字符在[]
中是取反的意思,但是如果把它放在整个表达式中就是 开始位置 的意思
转义
由于在正则表达式中.
、+
、\
等字符是一种特殊字符,属于表达式的一部分,所以在我们匹配时,如果需要用到这些特殊字符,就需要使用转义字符\
对它们进行转义,才能使用它们的字面含义
特殊字符由以下这些:
- 点
.
- 小括号
()
- 中括号
[]
- 大括号
{}
- 左斜杠
/
- 右斜杠
\
- 选择匹配符
|
例如:匹配一个网址时就需要使用到 /
和.
两个特殊字符,但由于/
和.
字符在正则表达式中是特殊字符,所以要使用转义字符\
来进行转义。
let url = 'https://www.baidu.com';
let url_reg = /\w+:\/\/[a-zA-z\.]+\w+/;
url.match(url_reg); // [https://www.baidu.com]
或者
它的作用就是使用|
字符可能出现的字符串全部进行一个排列,然后将前一个条件与排列出的字符进行一个组合。
let apple = 'ipone,ipad,imac,iaaa,ibbb,iccc';
let apple_reg = /i(pone|pad|mac)/g;
apple.match(apple_reg); // ['ipone','imac','ipad']
预查
正向预查
正向预查就是查看当前字符后面的字符是否符合?=
后面条件,如果符合,就将符合条件之前的查到的字符串进行一个输出。
let str = 'hello,when i am working,do not coming';
let str_reg = /\b\w+(?=ing\b)/g; // 匹配以 ing 结尾的单词的词根部分
str.match(str_reg); // ['work','com']
负向预查
反向预查则与正向预查相反,它的作用是查看当前字符后面的字符是不是不符合指定的条件,如果匹配成功就将该匹配到的字符串进行输出。在正则表达式中,使用?!
进行设置
let str = 'hello,when i am working,do not coming';
let str_reg = /\b\w+(?!ing)\w{3}\b/g; // 匹配以 ing 结尾的单词的词根部分
str.match(str_reg); // ['work','com']
匹配模式
贪婪模式
在正则表达式中,默认情况下,它执行的是能匹配多少就匹配多少的模式。这种模式被称为贪婪模式
或者贪婪匹配
let text = '我的QQ是 1960304555,我的手机号是 1520202123';
let qq_reg = /[1-9]\d{4,9}/g;
text.match(qq_reg); // ['1960304555','1520202123']
惰性匹配
惰性匹配
则是与贪婪匹配
相对应的一个匹配规则。在这种模式下,它只会按照最低要求来进行匹配。
要使用惰性匹配只需要在表达式的结尾加一个?
即可。
let text = '我的QQ是 1960304555,我的手机号是 1520202123';
let qq_reg = /[1-9]\d{4,9}?/g;
text.match(qq_reg); // ['19603','15202']
贪婪匹配和惰性匹配只在查多少的问题中,才有区别