正则表达式字面量模式与字符串模式
2017-07-24 06:00:00 # fontend

创建正则表达式


字面量模式

js 中通过 RegExp 类型来支持正则表达式,使用以下方法就可以创建一个正则表达式:

var expression = / pattern / flags;

每个表达式可带一个或多个 flags,用以表明正则表达式的行为。其匹配模式支持一下三种 flags

g: 表示全局模式,将被应用于所有字符串,而并不是在第一个匹配项立即结束
i: 表示不区分大小写
m: 表示多行(multiline)模式

RegExp 构造函数模式

通过实例化 RegExp 构造函数对象,这里多说一句,在ECMAScript 3 中正则表达式字面量始终是共用一个 RegExp 实例,而构造函数创建每次则会创建一个新的实例化对象,但是在 ECMAScript 5 中已经明确规定,字面量创建正则表达式必须每次都像直接调用 RegExp 对象那样,各浏览器厂商都对此作出了修改。

通过此模式创建正则表达式,传入参数为字符串:

1
2
3
4
5
6
7
8
9
// 正则表达式字面量模式
var pattern1 = /\[hello\]world/i;

pattern1.source; //返回 “\[hello\]world”

// 正则表达式对象模式
var pattern2 = new RegExp("\\[hello\\]world", "i");

pattern2.source; //返回 “\[hello\]world”

以上通过两种方式创建的同一含义的正则表达式,其 source 属性返回的都是正则表达式的字符串表示,值得注意的是返回的事按照字面量形式的字符串模式,而并不是你传入构造函数中的字符串模式,这里或许会有很多人搞混,直接把这个当成传入构造函数的字符串模式,然后进行一系列操作,然后可能就会一脸懵逼,怀疑智商。。。。。

传入构造函数中的字符串模式并不是正则表达式直接去外面的斜线,因为字符串模式中是需要双反斜杠 \ 来代替一个反斜杠 \ 的作用.


对比

两者相比而言,字面量模式显然更简洁更方便。有一点小差别就是采用字面量的写法,正则对象在代码载入时(即编译时)生成;采用构造函数的方法,正则对象在代码运行时生成。通常都会直接使用字面量形式创建,除非你的正则表达式需要在运行中才能生成,那就需要通过穿字符串的方式创建了。