意义:正则表达式是一种字符串的匹配模式。
用处:可以用来检查字符串里是否含有某种子串,将匹配的子串替换,或者取出某种子串。
工具:https://regexper.com/ 这个工具可以形象的查看正则表达式的作用形式
练习:日期替换
一. RegExp 对象
浏览器通过内置 RegExp 对象来支持正则表达式
有两种方法可以实例化正则表达式
正则表达式字面量
构造函数
字面量的方法: var reg = /\bis\b/g;
构造函数的方法: var reg = new RegExp("\bis\b","g")
1. 正则表达式由原意字符和元字符组成
原意字符:原意字符即指示字符本身的意思,比如 var reg = /a/ 即字符 a 本身的意思
元字符:在正则表达式中有特殊含义的非字母字符;比如 \b 表示单词的边界
2. 常见的一些用法总结
字符 | 用法 |
---|---|
预定义类 | |
或者[] 案例:[-+] | 要么是 - 或者是 + |
分组() | 小括号括起来的表示分组,这些分组也可以用 $1..$n 去表示 |
i | ignore case:忽略大小写;默认大小写是敏感的 |
g | global 全文搜索,如果不添加只搜索到第一个就停止了 |
m | multiple lines: 多行搜索 |
? | |
\ | |
* | 全部匹配 |
预定义类 | |
\d | 预定义类,等价于[0-9],表示数字 |
\D | 预定义类,等价于[^0-9], 表示非数字 |
\w | 预定义类,等价于[a-zA-Z0-9_],单词字符(字母数组下划线) |
\W | 预定义类,等价[^a-zA-Z0-9_]非单词类 |
\s | 预定义类,空白符 |
\S | 预定义类,非空白符 |
. | 预定义类,除了回车换行意外的所有字符等价[^\n\r] |
+ | |
| | 或者,表示可以匹配前面或者后面的字符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\0 | 空字符 |
\f | 换页符 |
\cX | 与X对应的控制字符 |
范围类 | |
[a-z] [a-z] | 范围类,a到z的任意字符 |
[0-9] | 范围类,0到9的任意字符 |
[a-zA-z] | 范围类,表示a到z不论大小写 |
量词 | |
? | 出现0次或者一次,即最多出现一次 |
+ | 出现一次或者多次,即至少出现一次 |
* | 出现零次或多次,即任意次 |
{n} | 出现 n 次 |
{n,m} | 出现 n 到 m 次 |
{n, } | 至少出现n次 |
边界 | |
$ | 边界字符,以xxx结尾 |
\b | 边界字符,单词边界 |
\B | 边界字符,非单词边界 |
^ | 边界字符,字符的开头;反向类,负向类,不属于某类的字符 |
3. 贪婪模式和非贪婪模式
正则表达式在匹配的时候默认是贪婪模式的,比如
"12345678".replace("/\d{3,6}/g", "X")
结果:"X78"
因此,非贪婪模式就是让正则表达式尽量少的匹配,一旦匹配到以后不再继续尝试就是非贪婪模式。
做法:只需要在量词后面加上?即可
"123456789".match("/\d{3,6}?/g")
结果: ["123",'456,'789'']
4. 分组
使用 () 可以达到分组的目的
5. 或者
或者用 | 来表示
6. 反向引用
比如 2020-10-1 要把它转化成 10/1/2020 那么可以用 2/
3") -->"10/2020/1"
() 将元素分组,使用 $n 可以拿到不同的分组
7. 忽略分组
不希望捕获某些分组,只需要在分组内加 ?: 就可以了
8. 前瞻和后顾
前瞻:正则表达式在匹配的时候从文本头部向尾部开始解析,文本尾部方向,称为“前”。正则表达式在匹配到规则的时候,向前检查是否符合断言,这个就是前瞻。符合断言的叫正向/肯定匹配,不符合的叫负向/否定匹配。
后顾则与前瞻相反。javescript 不支持后顾,所以这个部分不研究。
用处:比如我们想要匹配某个字符,但与此同时我们需要让他的前面的字符是或者不是某种条件。
名称 | 正则 | 含义 |
---|---|---|
正向前瞻 | exp(?=assert) | |
负向前瞻 | exp(?!assert) |
eg.
"a23".replace(/\w(?=\d)/g, "X")
// “X23”
\w(?=\d) 匹配第一个为单词字符,并且后面的为数字,所以结果为 X2*3。 (?=\d) 这个部分叫断言,起到判断的作用。
二. 方法
match
reduce