正则表达式(小记)

242 阅读3分钟

RegExp -> Reguler Express

正则表达式用来定义字符串的规则 两种定义形式

//字面量定义
const reg = / / 

//构造函数定义
const reg = new RegExp('')

正则方法

test --- 判断字符串是否满足正则规则 返回boolean值

exce --- 检索正则是否匹配字符串的值 返回null或者匹配到值的数组

支持传入正则的String对象方法

replace 替换字符串目标子串或符合正则规则的子串

search 搜索字符串中指定的子串 (子串可指定为正则对象)

split 按指定字符或规则 将字符串分割成字符数组

match 找出字符串中匹配正则规则的子串 返回一个字符数组 同exec方法

正则原子

1、修饰符

image.png

2、元字符

\ 转义字符

  功能1 将有意义的字符转义成没有意义的原子字符
  
  功能2 将没有意义的原子字符转义成有意义的字符

3、原子

\d 所有数字 === [0-9]

\D 所有非数字=== [^0-9]

\w 所有字符 包括0-9,a-z,A-Z,_ === [0-9a-zA-Z_]

\W 所有非字符 === [^0-9a-zA-Z_]

\s 所有空白 空白包括回车、tab键、空格等等一些===[\n\r\f\v\t]

\S 所有非空白 === [^\n\r\f\v\t]

4、. 可匹配除了换行以外的所有字符

如果想要匹配 .字符 需要使用转义字符 .

5、|

原子表 []

匹配原子表范围中的一个字符

原子表中使用 ^ 取非 标识匹配非这个范围 的字符

量词 {}

1.var find=/手机号\d{11}/——表示手机号后面数字重复112.var find=/昵称\d,6/——表示昵称的数字最少是63.var find=/密码\d{6,9}/——表示密码的数字个数的范围是6-94.var find=/爱好\d*/——表示爱好的个数可以是0或者任意个
5.var find=/上传附件\d?/——表示上传附件的个数可以是0或者16.var find=/家属\d+/——表示家属的个数最少是1

贪婪匹配 懒惰匹配

默认都是进行贪婪匹配 尽可能多的进行匹配 返回最长的匹配结果

懒惰匹配 尽可能少的匹配 返回短的匹配结果

使用 将贪婪匹配转换成懒惰匹配

边界

^ 开头 $ 结尾 \b 单词边界

量词

* 匹配出现0次或多次 + 匹配出现1次或多次 匹配出现0次或1次

子项(组)和 捕获

正则中使用 () 括中的规则称为一个组 (或者一个子项)如 /(\w+)([^\d]+)/g

捕获 \1 (1为捕获的组的序列号) 组从左到右编号1、2、3...

分组时的内容保存到内存缓冲区中  \n 则是从缓存区中取到内容

断言 (零宽断言)

零宽断言的意思是(匹配宽度为零,满足一定的条件/断言) 零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。

断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配

先行断言 匹配表达式前面的位置

先行断言的执行步骤是这样的先从要匹配的字符串中的最右端找到第一个ing(也就是先行断言中的表达式)然后 再匹配其前面的表达式,若无法匹配则继续查找第二个ing 再匹配第二个 ing前面的字符串,若能匹配 则匹配

例如:.(?=ing) 可以匹配cooking singing 中的cooking sing 而不是 cook*

正向先行断言 ?=
负向先行断言 ?!

负向零宽断言 (?!表达式) 也是匹配一个零宽度的位置,不过这个位置的“断言”取表达式的反值,例如 (?!表达式) 表示 表达式 前面的位置,如果 表达式 不成立 ,匹配这个位置;如果 表达式 成立,则不匹配:同样,负向零宽断言也有“先行”和“后发”两种,负向零宽后发断言为 (?<!表达式)

后行断言 匹配表达式后面的位置

后发断言跟先行断言恰恰相反 它的执行步骤是这样的:先从要匹配的字符串中的最左端找到第一个abc(也就是先行断言中的表达式)然后 再匹配其后面的表达式,若无法匹配则继续查找第二个abc 再匹配第二个abc后面的字符串,若能匹配 则匹配

正向后行断言 ?>=
负向后行断言 ?<!

案例

1、敏感字替换

将所有数字作为敏感字替换为*

let str = 'abca23hjkrh23j4h223h4jk'

const reg = /\d\g

str = str.replace(reg,'*')

2、中划线转换小驼峰

let str = 'get-element-by-id'

const reg = /-[a-zA-Z]/gi

str = str.replace(reg,function(val)=>{
    return val.split('')[1].toUpperCase();
})

3、行首行尾去空格

const reg = /^\s+ | \s+$/g

4、手机号码验证

image.png

const reg = /^0?1[3|4|5|7|8][0-9]{9}$/

5、qq号验证

image.png

const reg = /^[1-9][0-9]{4-9}$/

6、邮箱验证

image.png

const reg = /^(\w+){3,10}@([a-z0-9]{1,4})\.([a-z]{2,4})$/

7、数字千分符的分割

const reg  = /(?=(?!\b)(\d{3})+$)/ig

8、断言价格格式

const reg = /(\d)+(\.00)?+(?=元)/