1. 正则表达式定义
- 字面量形式
let reg = /pattern/flags
- pattern(模式):正则表达式匹配模式,可以包含字符类、限定符、分组、查找、引用
- flags(标志):
- 全局(g):在所有字符串中查找与模式匹配的项,不是找到第一个就匹配项就结束
- 不区分大小写(i):匹配时不区分大小写
- 多行(m):到一行结尾会继续查找下一行
- RegExp构造函数形式
let reg = new RegExp(pattern,flags)
- 两个参数均为字符串,使用元字符都要进行双重转义(否则会把转义后的看成字符串),要分清楚要的是字符串还是其特殊含义
- 正则表达式字面量始终共享一个RegExp实例,构造函数每次创建都是一个新实例
let reg1 = /[bc]at/i;
let reg2 = new RegExp('[bc]at','i');
let reg3 = /\[bc\]at/i;
let reg4 = new RegExp('\\[bc\\]at','i');
- 元字符
- 在正则表达式中有特殊含义的字符
- 包括()[]{}$^*+?.| (?😃(?=)(?<=)(?!)(?<!) \b\B\d\w\s
- 字面量模式中使用元字符且不代表特殊含义是必须转义
- 构造函数模式中使用元字符且不代表特殊含义是必须双重转义
- 规则
.:除换行符\n之外的,任意一个字符
..:除换行符\n之外的,任意两个字符
*:0个或多个(>=0)
+:1个或多个(>=1)
?:0个或1个(0或1)
{m}:限定个数,前一个字符出现m次
{m,}:限定个数,前一个字符至少出现m次
{m,n}:限定个数,前一个字符出现m到n次
|:或,一般和()一起使用,用于枚举一系列可替换的字符,也可以表示分组;
():子表达式开始和结束的位置
(|)等价于[]
[]:方括号中的任意一个字符,用“-”来表示范围限定,当“^”出现在[]中时表示取反,“不是/非”的意思
^:开头
$:结尾
<>:单词的左右边界
\:转义字符
\d:匹配一个数字,等价于[0-9]
\s:空白字符
\w:字母、数字、下划线,等价于[A-Za-z0-9_]
\b:单词边界 \bhello\b
\B:非单词边界,大写字母为小写字母的非 \bhello\B
\n:换行
\r:回车
\t:制表符
\s:任何空白字符
\f:换页符
- 元字符:[]{}()*+?|^$.\ (?😃 (?=) (?<=) (?!) (?<!)
- 限定符:指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,有{}*+?
- 定位符:能将正则表达式分别行首或行尾,描述字符串或单词边界,有^$\b\B
- 选择:(|)和(?😃,用()将所有选择项括起来,相邻选择项之间用|分割;用()表示捕获组,()会把每个分组里的匹配值保存起来,多个匹配值可以通过数字n来查看(表示第n个捕获组的内容);n[0]表示第0个捕获组的值;()会缓存相关的匹配,可将?:放在第一个选项前来清除(表示只匹配不存储)
- 断言:(?=) (?<=)
- 反向查找:(?!) (?<!)
/round(?=[\d]+)/g
/(?<=[0-9]+)round/g
/round(?![0-9]+)/g
/(?<![0-9]+)round/g
- 反向引用:对一个正则表达式模式或部分模式两边添加()将导致相关匹配存储到一个临时缓冲区中,所捕获的每个匹配都按照在正则表达式中从左到右出现的顺序存储,缓冲区编号从1到99,每个缓冲区都可以使用\n访问,其中n为一个表示特定缓冲区的一位或两位的十进制(即1-99);用于查找文本中两个相同的相邻的单词
var str = 'Is is the cost of of gasoline going up up';
var reg = /\b([a-z]+)\1\b/ig
reg.exec(str);
- 贪婪、非贪婪模式:*和+限定都是贪婪的,因为他们会尽可能多得匹配文字,只有在他们的后面加上一个?就可以实现非贪婪或最小匹配
- 非贪婪:\w*?、\w+?
- 贪婪:\w*、\w+
- 例子:
let str = '<h1>test</h1>';
str.match(/<.*>/g);
str.match(/<.*?>/g);
- 优先级:相同优先级从左到右,不同优先级先高后低
从高到低顺序:
转义:
方括号和圆括号:(?=)(?!)
限定符:*+?{}
定位符和序列:^$\任何元字符、任何字符
替换:|
2. RegExp实例属性
- global:布尔值,表示是否设置了标志g
- ignoreCase:布尔值,表示是否设置了标志i
- multiline:布尔值,表示是否设置了标志m
- source:正则表达式的字符串表示,即按字面量形式而非构造函数形式
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0开始
3. RegExp实例方法
- reg.exec(str):
- 参数为要应用模式的字符串
- 返回包含第一个匹配项信息的数组,无匹配返回null
- 数组中的第一项是与整个模式匹配的字符串,其他项时与模式中捕获组匹配的字符串
- 数组中还包含index(即匹配项在字符串中的位置)和input(即应用正则表达式的字符串)
- 不设置全局匹配g时,在字符串上多次调用exec(),将始终返回第一个匹配的项
- 设置全局匹配g时,在字符串上多次调用exec(),每次都会继续向后查找新的匹配项,指导查找到字符串结尾
- reg.test(str):
- 参数为要应用该模式的字符串,匹配到时返回true,否则返回false
- 实例的其他方法
- toString()、toLocalString():返回正则表达式的字面量
- valueOf():返回正则表达式本身
4. RegExp构造函数属性
- input/$_:最近一次匹配的字符串
- lastMatch/$&:最近一次匹配的匹配项
- lastParen/$+:最近一次匹配的捕获组
- leftContext/$`:input字符串中lastMatch之前的文本
- rightContext/$’:input字符串中lastMatch之后的文本
- multiline/$*:布尔值,表示是否所有表示是都使用多行模式
- RegExp.$1到RegExp.$9:分别表示第一个到第九个匹配的捕获组
let str = 'name-value,key1-nnn22&key2-xxx';
let reg = /-(\w{1})/g;
let str0 = str.replace(reg,'$1');
let str1 = str.replace(reg,function(a,b,c){
console.log(a,b,c);
return a.slice(1).toUpperCase();
})
console.log(str1)
console.log(str0)
let str = 'abc dee ew ieiwre jewww ee ';
let reg = /\s/g;
let str1= str.replace(reg,'');
console.log(str1);