RegExp 原型属性

dotAll 属性 #

基础说明 #

RegExp.prototype.dotAll

返回值为一个布尔值,表示该正则表达式是否处在dotAll模式。

如果使用了s修饰符,将返回Boolean类型的true,否则将返回false

s修饰符表示,特殊字符.应另外匹配字符串中的下述行终结符(line terminator characters),否则将会失配:

  • U+000A 换行符(\n
  • U+000D 回车符(\r
  • U+2028 行分隔符(line separator)
  • U+2029 段分隔符(paragraph separator)

这实际上意味着.将会匹配任意的单个Unicode Basic Multilingual Plane (BMP)字符。

若要使其与astral字符(大于\uFFFFUnicode字符)匹配,你应当使用uUnicode)修饰符。

一起使用这两个修饰符.将无一例外地匹配任意Unicode字符。


举例 #

((log) => {
    log(/foo.bar/.test('foo\nbar'));   // false
})(console.log)

上面代码中,因为.不匹配\n,所以正则表达式返回false

但是,很多时候我们希望匹配的是任意单个字符,这时有一种变通的写法。

((log) => {
    log(/foo[^]bar/.test('foo\nbar'));   // true
})(console.log)

这种解决方案毕竟不太符合直觉,ES2018 引入s修饰符,使得.可以匹配任意单个字符

/foo.bar/s.test('foo\nbar') // true

即开启dotAll模式,点(dot)代表一切字符

((log) => {
    const re = /foo.bar/s;
    // 另一种写法
    // const re = new RegExp('foo.bar', 's');

    log(re.test('foo\nbar')); // true
    log(re.dotAll); // true
    log(re.flags); // 's'
})(console.log)

tip #

/s修饰符和多行修饰符/m不冲突,两者一起使用的情况下,.匹配所有字符,而^$匹配每一行的行首行尾

目前该提案属于Stage 4Finished(定案阶段),预计实现时间是2018年,但是在MDN中,关于浏览器兼容性描述是

No compatibility data found. Please contribute data for `javascript.builtins.RegExp.dotAll`

请在使用中注意浏览器兼容性。

flags 属性 #

基础说明 #

RegExp.prototype.flags

flags属性返回一个字符串,由当前正则表达式对象的修饰符标志组成。

特性名特性值
writablefalse
enumerablefalse
configurabletrue

flags属性中的标志以字典序排序(从左到右,即gimsuy)。


举例 #

((log) => {
    log(/foo/ig.flags);   // `gi`
    log(/bar/myu.flags);  // `muy`
})(console.log)

Polyfill #


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

tip #

目前除了ChromeFirefox (Gecko)两大浏览器支持外,其他浏览器没有支持


lastIndex 属性 #

使用语法 #

lastIndex = regExpObj.lastIndex;
regExpObj.lastIndex = lastIndex;

基础说明 #

RegExp.lastIndex

lastIndex 是正则表达式的一个可读可写整型属性,用来指定下一次匹配起始索引

只有正则表达式使用了表示全局检索的 g 标志时,该属性才会起作用,并且动态维护。此时应用下面的规则:

  • 如果lastIndex大于字符串的长度,则 regexp.testregexp.exec 将会匹配失败,然后lastIndex被设置为 0
  • 如果lastIndex等于字符串长度,且该正则表达式匹配空字符串,则该正则表达式匹配从lastIndex开始的字符串。(then the regular expression matches input starting at lastIndex.)
  • 如果lastIndex小于字符串长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串lastIndex 被设置为 0
  • 否则,lastIndex 被设置为紧随最近一次成功匹配下一个位置

举例 #

基础举例 #

((log) => {
    const re = /(hi)?/g;
    log(re.exec("hi"));   // ["hi", "hi", index: 0, input: "hi", groups: undefined]
    log(re.lastIndex);  // 2

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

第一次匹配完毕之后,lastIndex值为2,而hi 长度为2,即这个时候lastIndex等于字符串长度 ,则该正则表达式匹配空字符串正则表达式匹配从lastIndex开始的字符串。

所以,第二次返回 ["", undefined],因为没有进行下一次匹配,lastIndex的值没有变。


直接指定lastIndex属性 #

((log) => {
    const REGEX = /a/g;

    // 指定从2号位置(y)开始匹配
    REGEX.lastIndex = 2;

    // 匹配成功
    const match = REGEX.exec('xaya');

    // 在3号位置匹配成功
    log(match.index); // 3

    // 下一次匹配从4号位开始
    log(REGEX.lastIndex); // 4

    // 4号位开始匹配失败
    log(REGEX.exec('xaya')); // null
})(console.log)

上面代码中,lastIndex属性指定每次搜索的开始位置g修饰符从这个位置开始向后搜索,直到发现匹配为止。

结合y修饰符 #

y修饰符同样遵守lastIndex属性,但是要求必须在lastIndex指定的位置发现匹配

((log) => {
    const REGEX = /a/y;

    // 指定从2号位置开始匹配
    REGEX.lastIndex = 2;

    // 不是粘连,匹配失败
    log(REGEX.exec('xaya')); // null

    // 指定从3号位置开始匹配
    REGEX.lastIndex = 3;

    // 3号位置是粘连,匹配成功
    const match = REGEX.exec('xaya');
    log(match.index); // 3
    log(REGEX.lastIndex);// 4
})(console.log)

tip #

目前所有浏览器都支持这个属性设置和获取


global 属性 #

基础说明 #

RegExp.prototype.global

返回值为一个布尔值,表示该正则表达式是否使用了g 标志。

如果使用了g修饰符,将返回Boolean类型的true,否则将返回false

global 是一个正则表达式实例的只读属性

特性名特性值
writablefalse
enumerablefalse
configurablefalse

举例 #

((log) => {
    const regex1 = /foo/g;
    log(regex1.global);   // true

    const regex2 = new RegExp("foo", "g");
    log(regex2.global);   // true
})(console.log)

tip #

目前所有浏览器都支持这个属性获取

global最初只是RegExp实例的属性,而不是RegExp对象的属性。

global现在是一个原型访问器属性,而不是实例自己的数据属性


ignoreCase 属性 #

基础说明 #

RegExp.prototype.ignoreCase

返回值为一个布尔值,表示该正则表达式是否使用了i 标志。

如果使用了i修饰符,将返回Boolean类型的true,否则将返回false

ignoreCase 是一个正则表达式实例的只读属性

特性名特性值
writablefalse
enumerablefalse
configurablefalse

举例 #

((log) => {
    const regex1 = /foo/gi;
    log(regex1.ignoreCase);   // true

    const regex2 = new RegExp("foo", "ig");
    log(regex2.ignoreCase);   // true
})(console.log)

tip #

目前所有浏览器都支持这个属性获取,i 标志意味着在字符串进行匹配时,应该忽略大小写

ignoreCase最初只是RegExp实例的属性,而不是RegExp对象的属性。

ignoreCase现在是一个原型访问器属性,而不是实例自己的数据属性


multiline 属性 #

基础说明 #

RegExp.prototype.multiline

返回值为一个布尔值,表示该正则表达式是否使用了m 标志。

如果使用了m修饰符,将返回Boolean类型的true,否则将返回false

multiline 是一个正则表达式实例的只读属性

特性名特性值
writablefalse
enumerablefalse
configurablefalse

举例 #

((log) => {
    const regex1 = /foo/gm;
    log(regex1.multiline);   // true

    const regex2 = new RegExp("foo", "img");
    log(regex2.multiline);   // true
})(console.log)

tip #

目前所有浏览器都支持这个属性获取,m 标志意味着一个多行输入字符串被看作多行

例如,使用 m^$ 将会从只匹配正则字符串开头结尾,变为匹配字符串任一行开头结尾

multiline最初只是RegExp实例的属性,而不是RegExp对象的属性。

multiline现在是一个原型访问器属性,而不是实例自己的数据属性


source 属性 #

基础说明 #

RegExp.prototype.source

source 属性返回一个值为当前正则表达式对象模式文本字符串,该字符串不会包含正则字面量两边的斜杠以及任何的修饰符字符。

举例 #

((log) => {
    const regex1 = /foo/gm;
    log(regex1.source);   // foo

    const regex2 = new RegExp("foo", "img");
    log(regex2.source);   // foo
})(console.log)

tip #

目前所有浏览器都支持这个属性获取

source最初只是RegExp实例的属性,而不是RegExp对象的属性。

source现在是一个原型访问器属性,而不是实例自己的数据属性


sticky 属性 #

基础说明 #

RegExp.prototype.sticky

返回值为一个布尔值,表示该正则表达式是否使用了y 标志,即搜索是否具有粘性( 仅从正则表达式的 lastIndex 属性表示的索引处搜索 )。

如果使用了y修饰符,将返回Boolean类型的true,否则将返回false

sticky 是一个正则表达式实例的只读属性

特性名特性值
writablefalse
enumerablefalse
configurablefalse

举例 #

((log) => {
    const regex1 = /foo/y;
    log(regex1.sticky);   // true

    const regex2 = new RegExp("foo", "y");
    log(regex2.sticky);   // true
})(console.log)

tip #

目前ChromeEdgeFirefox (Gecko)浏览器支持该属性获取。

当使用带有y标识的匹配模式时,^断言总是会匹配输入开始位置或者(如果是多行模式)每一行的开始位置

可以使用 try { … } catch { … } 来测试运行时(run-time)是否支持 sticky 标志。

这种情况下,必须使用 eval(…) 表达式或 RegExp(regex-string, flags-string) 语法(这是由于 /regex/flags 表示法将会在编译时刻被处理,因此在 catch 语句块处理异常前就会抛出一个异常

((log) => {
    let supports_sticky;
    try {
        RegExp('','y');
        supports_sticky = true;
    }catch(e) {
        supports_sticky = false;
    }
    log(supports_sticky); // true

})(console.log)


unicode 属性 #

基础说明 #

RegExp.prototype.unicode

返回值为一个布尔值,表示该正则表达式是否使用了u 标志。

如果使用了u修饰符,将返回Boolean类型的true,否则将返回false

unicode 是一个正则表达式实例的只读属性

特性名特性值
writablefalse
enumerablefalse
configurablefalse

举例 #

((log) => {
    const regex1 = /\u{61}/u;
    log(regex1.unicode);   // true
    log(regex1.source);   // \u{61}

    const regex2 = new RegExp('\u{61}', 'u');
    log(regex2.unicode);   // true
    log(regex2.source);   // a
})(console.log)

tip #

目前ChromeEdgeFirefox (Gecko)浏览器支持该属性获取。

u 标志开启了多种 Unicode 相关的特性。使用 u 标志,任何 Unicode 代码点的转译都会被解释

注意开启u 标志,最好结合构造函数进行使用,如果是字面量正则表达式,则内容是不会转译的。


MDN地址 #

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp

Build by Loppo 0.6.16