RegExp对象
本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript)
RegExp 构造函数可创建一个正则表达式对象,用特定的模式匹配文本。
语法
RegExp(pattern [, flags])
/pattern/flags
参数
- pattern 正则表达式文本
- g 全局匹配
- i 忽略大小写
- m 让开始和结束字符(^ 和 $)工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由
或
分割的),而不只是整个输入字符串的最开始和最末尾处。
- u Unicode。将模式视为Unicode码位(code points)序列。
- y 新增,大部分浏览器暂不支持,sticky;matches only from the index indicated by the lastIndex property of this regular expression in the target string (and does not attempt to match from any later indexes). This allows the match-only-at-start capabilities of the character "^" to effectively be used at any location in a string by changing the value of the lastIndex property.
有两种方法可以创建一个正则对象:字面量和构造函数。要表示字符串,字面量形式不使用引号,而传递给构造函数的参数使用引号。下面表达式创建相同的正则表达式:
/ab+c/i;
new RegExp('ab+c', 'i'); //需要常规的字符转义规则
new RegExp(/ab+c/, 'i'); //ES6新增允许的写法
- 当表达式被赋值时,字面量形式提供正则表达式的编译(compilation)状态,正则对象在代码载入时(即编译时)生成,当正则表达式保持为常量时使用字面量。例如当你在循环中使用字面量构造一个正则表达式时,正则表达式不会在每一次迭代中都被重新编译(recompiled)。
- 而正则表达式对象的构造函数,如 new RegExp('ab+c') 提供了正则表达式运行时编译(正则对象在代码运行时生成)。如果你知道正则表达式模式将会改变,或者你事先不知道什么模式,而是从另一个来源获取,如用户输入,这些情况都可以使用构造函数。
注意:不要把正则表达式字面量(或者正则表达式构造器)直接放在 while 条件表达式里(而应该先保存到一个变量)。因为循环的每次匹配条件都是一个新的正则表达式,每次迭代时 lastIndex 的属性都被重置为0,如果匹配,将会造成一个死循环。
var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
var msg = 'Found ' + myArray[0] + '. ';
msg += 'Next match starts at ' + myRe.lastIndex;
console.log(msg);
}
正则对象生成以后,有两种使用方式:
- 正则对象的方法:将字符串作为参数,如 regex.test(str)。
- 字符串对象的方法:正则对象被作为参数,如 str.match(regex)。
正则表达式中的特殊字符
- 字符类别(Character Classes)
- 字符集合(Character Sets)
- 边界(Boundaries)
- 分组(grouping)与反向引用(back references)
- 数量词(Quantifiers)