面试知识点总结 - js RegExp

1. 正则表达式定义

  1. 字面量形式
let reg = /pattern/flags
  1. pattern(模式):正则表达式匹配模式,可以包含字符类、限定符、分组、查找、引用
  2. flags(标志):
  1. 全局(g):在所有字符串中查找与模式匹配的项,不是找到第一个就匹配项就结束
  2. 不区分大小写(i):匹配时不区分大小写
  3. 多行(m):到一行结尾会继续查找下一行
  1. RegExp构造函数形式
let reg = new RegExp(pattern,flags)
  1. 两个参数均为字符串,使用元字符都要进行双重转义(否则会把转义后的看成字符串),要分清楚要的是字符串还是其特殊含义
  2. 正则表达式字面量始终共享一个RegExp实例,构造函数每次创建都是一个新实例
//下面两个正则表达式相等,都是匹配bat或者cat;
let reg1 = /[bc]at/i;
let reg2 = new RegExp('[bc]at','i');
//下面两个正则表达式相等,都是匹配[bc]at;
//[]不取其特殊含义,只当成普通字符;
//如果直接写'\[bc\]at',会把他们整体当成一个字符串即\[bc\]at,所以要双重转义;
//所以当使用元字符不使用其特殊含义是,要双重转义
let reg3 = /\[bc\]at/i;
let reg4 = new RegExp('\\[bc\\]at','i');
  1. 元字符
  1. 在正则表达式中有特殊含义的字符
  2. 包括()[]{}$^*+?.| (?😃(?=)(?<=)(?!)(?<!) \b\B\d\w\s
  3. 字面量模式中使用元字符且不代表特殊含义是必须转义
  4. 构造函数模式中使用元字符且不代表特殊含义是必须双重转义
  1. 规则
.:除换行符\n之外的,任意一个字符
..:除换行符\n之外的,任意两个字符
*0个或多个(>=0+1个或多个(>=1?0个或1个(01{m}:限定个数,前一个字符出现m次
{m,}:限定个数,前一个字符至少出现m次
{m,n}:限定个数,前一个字符出现m到n次

|:或,一般和()一起使用,用于枚举一系列可替换的字符,也可以表示分组;
():子表达式开始和结束的位置
(|)等价于[]
[]:方括号中的任意一个字符,用“-”来表示范围限定,当“^”出现在[]中时表示取反,“不是/非”的意思
//1|2:1或2
//(0|1|2)==[0-2] 0或1或2
//[^abc]非abc
//[A-Z0-9]:所有字母、数字中的任意一个
//[A-Z 0-9]:所有字母、数字、空格中的任意一个
//[1,2,3]:123中的任意一个

^:开头
$:结尾
<>:单词的左右边界
\:转义字符

\d:匹配一个数字,等价于[0-9]
\s:空白字符
\w:字母、数字、下划线,等价于[A-Za-z0-9_]
\b:单词边界	\bhello\b
\B:非单词边界,大写字母为小写字母的非	\bhello\B

\n:换行
\r:回车
\t:制表符
\s:任何空白字符
\f:换页符
  1. 元字符:[]{}()*+?|^$.\ (?😃 (?=) (?<=) (?!) (?<!)
  2. 限定符:指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,有{}*+?
  3. 定位符:能将正则表达式分别行首或行尾,描述字符串或单词边界,有^$\b\B
  4. 选择:(|)和(?😃,用()将所有选择项括起来,相邻选择项之间用|分割;用()表示捕获组,()会把每个分组里的匹配值保存起来,多个匹配值可以通过数字n来查看(表示第n个捕获组的内容);n[0]表示第0个捕获组的值;()会缓存相关的匹配,可将?:放在第一个选项前来清除(表示只匹配不存储)
  5. 断言:(?=) (?<=)
  6. 反向查找:(?!) (?<!)
/round(?=[\d]+)/g			//匹配前面是数字的round
//123**round**456**round**789		
/(?<=[0-9]+)round/g			//匹配后面是数字的round
//123**round**456round
/round(?![0-9]+)/g			//匹配后面不是数字的round
//123**round**-google456round789
/(?<![0-9]+)round/g			//匹配前面不是数字的round
//123google-**round**456round789
  1. 反向引用:对一个正则表达式模式或部分模式两边添加()将导致相关匹配存储到一个临时缓冲区中,所捕获的每个匹配都按照在正则表达式中从左到右出现的顺序存储,缓冲区编号从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);
  1. 贪婪、非贪婪模式:*和+限定都是贪婪的,因为他们会尽可能多得匹配文字,只有在他们的后面加上一个?就可以实现非贪婪或最小匹配
  1. 非贪婪:\w*?、\w+?
  2. 贪婪:\w*、\w+
  3. 例子:
let str = '<h1>test</h1>';
str.match(/<.*>/g);		//<h1>test</h1>
str.match(/<.*?>/g);	//<h1>
  1. 优先级:相同优先级从左到右,不同优先级先高后低
    从高到低顺序:

转义:
方括号和圆括号:(?=)(?!)
限定符:*+?{}
定位符和序列:^$\任何元字符、任何字符
替换:|

2. RegExp实例属性

  1. global:布尔值,表示是否设置了标志g
  2. ignoreCase:布尔值,表示是否设置了标志i
  3. multiline:布尔值,表示是否设置了标志m
  4. source:正则表达式的字符串表示,即按字面量形式而非构造函数形式
  5. lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0开始

3. RegExp实例方法

  1. reg.exec(str):
  1. 参数为要应用模式的字符串
  2. 返回包含第一个匹配项信息的数组,无匹配返回null
  3. 数组中的第一项是与整个模式匹配的字符串,其他项时与模式中捕获组匹配的字符串
  4. 数组中还包含index(即匹配项在字符串中的位置)和input(即应用正则表达式的字符串)
  5. 不设置全局匹配g时,在字符串上多次调用exec(),将始终返回第一个匹配的项
  6. 设置全局匹配g时,在字符串上多次调用exec(),每次都会继续向后查找新的匹配项,指导查找到字符串结尾
  1. reg.test(str):
  1. 参数为要应用该模式的字符串,匹配到时返回true,否则返回false
  1. 实例的其他方法
  1. toString()、toLocalString():返回正则表达式的字面量
  2. valueOf():返回正则表达式本身

4. RegExp构造函数属性

  1. input/$_:最近一次匹配的字符串
  2. lastMatch/$&:最近一次匹配的匹配项
  3. lastParen/$+:最近一次匹配的捕获组
  4. leftContext/$`:input字符串中lastMatch之前的文本
  5. rightContext/$’:input字符串中lastMatch之后的文本
  6. multiline/$*:布尔值,表示是否所有表示是都使用多行模式
  7. RegExp.$1到RegExp.$9:分别表示第一个到第九个匹配的捕获组
//短横线转为驼峰、$1
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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值