一种构成
正则表达式是由字符+元字符+修饰符构成的一种对象形式的工具。
字符
字符单独使用的情况下,常常用于一些固定的匹配,比如/abc/,可以在某字符串中匹配abc
元字符
单独使用字符串匹配单一,搭配元字符食用更佳,比如我像匹配多个字符,就需要用到元字符
比如集合元字符[]通过集合即[]的使用来规定一个字符范围达到匹配多个字符的效果,比如/[abc]/可以匹配 a,b,c 三个字符串
let reg = /[huy]/;let str = "abchg";let _str = "abyg";console.log(reg.test(str)); // trueconsole.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
复制代码
评论