正则表达式的修饰符及构造函数
正则表达式的修饰符及构造函数
1. 修饰符
正则表达式还可以跟上修饰符(/exp/修饰符
)限制正则表达式的行为。
介绍三个常用的修饰符:
修饰符 | 作用 |
---|---|
i | 忽略大小写 |
g | 全局匹配 |
m | 多行匹配 |
修饰符介绍:i
修饰符i
表示匹配时忽略大小写,例如:
reg = /AbDe/i;
console.log(reg.test(" aBde "));
修饰符介绍:g
修饰符g
表示全局匹配。在没有修饰符g
的情况下,只会进行第一次
匹配,也就是说,只要找到符合正则表达式的子串,就停止匹配。
举例:
reg = /a/;
str = "aaabbaa";
str = str.replace(reg, "b");
console.log(str);
replace(reg:RegExp, str:string),是一个字符串的替换函数,将字符串中与正则表达式匹配的子串替换为str表示的字符串
在上面的例子中,想要将aaabbaa
中的a
都替换为b
,但是最后的结果式baabbaa
,这是因为正则表达式/a/
只会进行第一次匹配
,在第一次匹配之后,就停止匹配。
如果想要匹配完整的字符串,需要用到修饰符g
将上面代码中的正则表达式修改为:
reg = /a/g;
修饰符介绍:m
修饰符m
表示多行匹配。
例如,有以下字符串aaabbaa\naaabbaa
。如果想要通过replace()
方法,将字符串改为baabbaa\nbaabbaa
,也就是说将这个字符串(有两行)的每一行开头的a
修改为b
。
举例:
reg = /^a/m;
str = "aaabbaa\naaabbaa";
str = str.replace(reg, "b");
console.log(str);
结果和预想的不一样,接下来分析原因
在匹配时,如果正则表达式没有被m修饰,在匹配字符串时,字符串只有一个开头^
和结束$
;如果正则表达式被修饰符m修饰,表示每一行的开头都可以和^
匹配,每一行的结尾都可以被$
匹配。上面的例子中,由于不是全局匹配,则第一次匹配成功后就结束
也就是说,上面的例子仍然需要全局匹配,正则表达式应该是/^a/mg(修饰符可以组合使用,没有顺序限制)
为了加深对修饰符m的理解,仅使用g
修饰正则表达式:
reg = /^a/g;
str = "aaabbaa\naaabbaa"
结果也仅仅是修改了第一个a
,因为没有使用m
,在匹配时,认为只有一个开头和一个结尾。如果加上m,每一行都有自己的开头(可以和^
匹配)和自己的结尾
2. 构造函数RegExp(正则表达式,修饰符)
除了使用“字面量”的方式创建正则表达式对象,还可以使用构造函数创建正则表达式。
先来回顾一下通过字面量创建正则表达式的方式:var reg = /表达式/修饰符
使用构造函数创建:
var reg = new RegExp(表达式, 修饰符)
举例:
var reg1 = /^abcd$/ig;
var reg2 = new RegExp("^abcd$", "ig");
console.log("reg1 = " + reg1);
console.log("reg2 = " + reg2);
使用字面量创建时,表达式的内容不用使用""
,然而,使用构造函数时,第一个参数传入的是一个字符串,字符串的内容是表达式,因为是字符串,所以要使用双引号
使用构造函数创建的优点:参数可以使用变量
使用字面量和使用构造函数,都可以创建正则表达式对象。采用字面量创建的正则表达式是“死”的,而使用构造函数,表达式的内容(字符串)可以使用变量代替,因此使用构造函数创建更加灵活。
上一篇: JS修饰符与正则表达式
下一篇: nginx常用配置说明