持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
一种构成
正则表达式是由字符+元字符+修饰符构成的一种对象形式的工具。
字符
字符单独使用的情况下,常常用于一些固定的匹配,比如/abc/,可以在某字符串中匹配abc
元字符
单独使用字符串匹配单一,搭配元字符食用更佳,比如我像匹配多个字符,就需要用到元字符
比如集合元字符[]通过集合即[]的使用来规定一个字符范围达到匹配多个字符的效果,比如/[abc]/可以匹配a,b,c三个字符串
let reg = /[huy]/;
let str = "abchg";
let _str = "abyg";
console.log(reg.test(str)); // true
console.log(reg.test(_str)); // true
更多元字符可以查阅mdn文档正则表达式 - JavaScript | MDN (mozilla.org)
修饰符
修饰符是位于正则表达式外的结尾位置,用于指定匹配策略
let reg = /hogskin/i;
let str = "HogSkin";
console.log(reg.test(str)); // true
| 修饰符 | 作用 |
|---|---|
| i | 不区分大小写匹配 |
| g | 全局匹配 |
| m | 多行匹配 |
| u | Unicode模式(处理四字节的UTF-16编码比如:𠮷) |
| y | 全局匹配但是与g不同,下文会讲解二者区别 |
| s | 使圆点匹配任意的单个字符 |
除此之外修饰符可以叠加使用,在结尾直接添加需要的匹配策略即可
let reg = /hogskin/gi;
let str = "HogSkinHogSkin";
console.log(str.match(reg));
[ 'HogSkin', 'HogSkin' ]
关于修饰符s
在正则中.圆点,可以匹配任意单个字符,如下
let reg = /a./;
let str = "a_a_a";
console.log(reg.test(str)); // true
但是遇到行终止符就不会被匹配,比如\n,\r
let reg = /a./;
let str = "a\na\na";
console.log(reg.test(str)); // false
所以需要引入s修饰符,达到一个dotAll模式,即所有字符都匹配
let reg = /a./s;
let str = "a\na\na";
console.log(reg.test(str)); // true
修饰符y与g的区别
y和g都为全局匹配,但是y相对于g来讲多了一种^的特性即头部匹配,通过下面例子还凸显y的特性
let reg = /a/y;
let str = "a_a_a";
console.log(reg.exec(str)); // [ 'a', index: 0, input: 'a_a_a', groups: undefined ]
console.log(reg.exec(str)); // null
let reg = /a/g;
let str = "a_a_a";
console.log(reg.exec(str)); // [ 'a', index: 0, input: 'a_a_a', groups: undefined ]
console.log(reg.exec(str)); // [ 'a', index: 2, input: 'a_a_a', groups: undefined ]
console.log(reg.exec(str)); // [ 'a', index: 4, input: 'a_a_a', groups: undefined ]
可以看到以y为修饰符的情况第二个a没有被匹配到,因为在匹配到第一个a后,字符串剩下的为_a_a,由于头部为_所以无法匹配,这就是y与g的区别,如果将匹配正则改为a_
let reg = /a_/y;
let str = "a_a_a";
console.log(reg.exec(str)); // [ 'a_', index: 0, input: 'a_a_a', groups: undefined ]
console.log(reg.exec(str)); // [ 'a_', index: 2, input: 'a_a_a', groups: undefined ]
修饰符属性
正则对象属性中有一个flag属性,可以返回正则的修饰符
let reg = /a_/y;
console.log(reg.flags); // y
判断修饰符
还可以通过正则的属性判断是否包含y修饰符
let reg = /a_/y;
console.log(reg.sticky); // true
也可以对s修饰符进行判断,判断是否开启dotAll模式来判断是否使用了s修饰符
let reg = /a./s;
console.log(reg.dotAll); // true