Skip to main content

JS 内置对象之 RegExp

RegExp(正则表达式)对象用于将文本与一个模式匹配。

一、属性

1、source

返回一个值为当前 RegExp 对象的模式文本的字符串,该字符串不会包含正则字面量两边的斜杠以及任何的标志字符。

var regex = /fooBar/ig;
console.log(regex.source); // "fooBar",不包含 /.../ 和 "ig"。

2、flags

  • 描述:返回一个字符串,由当前 RegExp 对象的标志组成(以字典序排序从左到右,即"gimuy")。
  • 值:g i m u y。
/foo/ig.flags;   // "gi"
/bar/myu.flags; // "muy"

Polyfill

if (RegExp.prototype.flags === undefined) {
Object.defineProperty(RegExp.prototype, 'flags', {
configurable: true,
get: function () {
return this.toString().match(/[gimuy]*$/)[0];
}
});
}

3、global

  • 描述:RegExp 对象是否具有标志 g,即全局匹配。
  • 值:true / false。
var regex = new RegExp("foo", "g")
console.log(regex.global) // true

4、ignoreCase

  • 描述:RegExp 对象是否具有标志 i,即忽略大小写。
  • 值:true / false。
var regex = new RegExp("foo", "i")
console.log(regex.ignoreCase) // true

5、multiline

  • 描述:RegExp 对象是否具有标志 m,即多行输入字符串被视为多行(使用 m^$ 将会从只匹配正则字符串的开头或结尾,变为匹配字符串中任一行的开头或结尾)。
  • 值:true / false。
var regex = new RegExp("foo", "m")
console.log(regex.multiline) // true

6、unicode

  • 描述:RegExp 对象是否具有标志 u,即任何 Unicode 代码点的转义都会被解释。
  • 值:true / false。
var regex = new RegExp('\u{61}', 'u');
console.log(regex.unicode); // true

7、sticky

  • 描述:RegExp 对象是否具有标志 y,即搜索具有粘性。
  • 值:true / false。
var regex = new RegExp('foo', 'y');
console.log(regex.sticky); // true

8、lastIndex

描述:lastIndex 用于规定下次匹配的起始位置。

只有使用了表示全局匹配 g 的 RegExp(正则表达式)对象,该属性才会起作用。此时应用下面的规则:

  • 如果 lastIndex > 字符串的长度,则 regexp.testregexp.exec 将会匹配失败,然后 lastIndex 被设为 0。
  • 如果 lastIndex = 字符串的长度且该正则表达式匹配空字符串,则该正则表达式匹配从 lastIndex 开始的字符串。
  • 如果 lastIndex = 字符串的长度且该正则表达式不匹配空字符串,则该正则表达式不匹配字符串,lastIndex 被设为 0。
  • 否则 lastIndex 被设置为紧随最近一次成功匹配的下一个位置。
var re = /(hi)?/g;

console.log(re.exec("hi")); // ["hi", "hi", index: 0, input: "hi", groups: undefined]
console.log(re.lastIndex); // 2

console.log(re.exec("hi")); // ["", undefined, index: 2, input: "hi", groups: undefined]
console.log(re.lastIndex); // 2

上面代码中,先返回 ["hi", "hi"] ,lastIndex 等于 2。

随后返回 ["", undefined],即一个数组,其第 0 个元素为匹配的字符串。此种情况下为空字符串,是因为 lastIndex 为 2(且一直是 2),"hi" 长度为 2。

二、方法

1、exec

regexObj.exec(str)

功能:用于检索字符串中的正则表达式的匹配。

参数:string(必须),要检索的字符串。

返回值:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null

示例:

var regex = RegExp('foo*', 'g');
console.log(regex.exec('table football, foosball'));
// ["foo", index: 6, input: "table football, foosball", groups: undefined]
console.log(regex.exec('table fo'));
// null

2、test

regexObj.test(str)

功能:用于检测一个字符串是否匹配某个模式。

参数:string(必须),要检索的字符串。

返回值:true / false

示例:

var regex = new RegExp('foo*');
console.log(regex.test('table football')); // true
console.log(regex.test('table fo')); // true
console.log(regex.test('table x')); // false

3、toString

regexObj.toString()

功能:返回一个表示该正则表达式的字符串。

参数:无。

返回值:字符串。

示例:

myExp = new RegExp("a+b+c");
console.log(myExp.toString()); // /a+b+c/

foo = new RegExp("bar", "g");
console.log(foo.toString()); // /bar/g