一种构成
正则表达式是由字符+元字符+修饰符构成的一种对象形式的工具。
字符
字符单独使用的情况下,常常用于一些固定的匹配,比如/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
复制代码
除此之外修饰符可以叠加使用,在结尾直接添加需要的匹配策略即可
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
复制代码
评论