RegExp.prototype.dotAll
返回值为一个布尔值
,表示该正则表达式
是否处在dotAll
模式。
如果使用了s
修饰符,将返回Boolean
类型的true
,否则将返回false
。
s
修饰符表示,特殊字符.
应另外匹配字符串中的下述行终结符(line terminator characters
),否则将会失配:
\n
)\r
)这实际上意味着.
将会匹配任意的单个Unicode Basic Multilingual Plane
(BMP
)字符。
若要使其与astral
字符(大于\uFFFF
的Unicode
字符)匹配,你应当使用u
(Unicode
)修饰符。
一起使用这两个修饰符
,.
将无一例外地匹配任意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)
/s
修饰符和多行修饰符/m
不冲突,两者一起使用的情况下,.
匹配所有字符,而^
和$
匹配每一行的行首
和行尾
。
目前该提案属于Stage 4
即 Finished(定案阶段)
,预计实现时间是2018年
,但是在MDN中,关于浏览器兼容性描述是
No compatibility data found. Please contribute data for `javascript.builtins.RegExp.dotAll`
请在使用中注意浏览器兼容性。
RegExp.prototype.flags
flags
属性返回一个字符串,由当前正则表达式
对象的修饰符标志
组成。
特性名 | 特性值 |
---|---|
writable | false |
enumerable | false |
configurable | true |
flags
属性中的标志以字典序排序(从左到右,即gimsuy
)。
((log) => {
log(/foo/ig.flags); // `gi`
log(/bar/myu.flags); // `muy`
})(console.log)
if (RegExp.prototype.flags === undefined) {
Object.defineProperty(RegExp.prototype, 'flags', {
configurable: true,
get: function() {
return this.toString().match(/[gimsuy]*$/)[0];
}
});
}
目前除了Chrome
和Firefox (Gecko)
两大浏览器支持外,其他浏览器没有支持
lastIndex = regExpObj.lastIndex;
regExpObj.lastIndex = lastIndex;
RegExp.lastIndex
lastIndex
是正则表达式的一个可读可写
的整型
属性,用来指定下一次匹配
的起始索引
。
只有正则表达式
使用了表示全局检索的 g
标志时,该属性
才会起作用,并且值
被动态维护
。此时应用下面的规则:
lastIndex
大于字符串的长度,则 regexp.test
和 regexp.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
的值没有变。
((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)
目前所有浏览器都支持这个属性设置和获取
RegExp.prototype.global
返回值为一个布尔值
,表示该正则表达式
是否使用了g
标志。
如果使用了g
修饰符,将返回Boolean
类型的true
,否则将返回false
。
global
是一个正则表达式
实例的只读属性
。
特性名 | 特性值 |
---|---|
writable | false |
enumerable | false |
configurable | false |
((log) => {
const regex1 = /foo/g;
log(regex1.global); // true
const regex2 = new RegExp("foo", "g");
log(regex2.global); // true
})(console.log)
目前所有浏览器都支持这个属性获取
global
最初只是RegExp
实例的属性,而不是RegExp
对象的属性。
global
现在是一个原型访问器属性
,而不是实例
自己的数据属性
。
RegExp.prototype.ignoreCase
返回值为一个布尔值
,表示该正则表达式
是否使用了i
标志。
如果使用了i
修饰符,将返回Boolean
类型的true
,否则将返回false
。
ignoreCase
是一个正则表达式
实例的只读属性
。
特性名 | 特性值 |
---|---|
writable | false |
enumerable | false |
configurable | false |
((log) => {
const regex1 = /foo/gi;
log(regex1.ignoreCase); // true
const regex2 = new RegExp("foo", "ig");
log(regex2.ignoreCase); // true
})(console.log)
目前所有浏览器都支持这个属性获取,i
标志意味着在字符串
进行匹配时,应该忽略大小写
。
ignoreCase
最初只是RegExp
实例的属性,而不是RegExp
对象的属性。
ignoreCase
现在是一个原型访问器属性
,而不是实例
自己的数据属性
。
RegExp.prototype.multiline
返回值为一个布尔值
,表示该正则表达式
是否使用了m
标志。
如果使用了m
修饰符,将返回Boolean
类型的true
,否则将返回false
。
multiline
是一个正则表达式
实例的只读属性
。
特性名 | 特性值 |
---|---|
writable | false |
enumerable | false |
configurable | false |
((log) => {
const regex1 = /foo/gm;
log(regex1.multiline); // true
const regex2 = new RegExp("foo", "img");
log(regex2.multiline); // true
})(console.log)
目前所有浏览器都支持这个属性获取,m
标志意味着一个多行
输入字符串被看作多行
。
例如,使用 m
,^
和 $
将会从只匹配正则字符串
的开头
或结尾
,变为匹配字符串
中任一行
的开头
或结尾
。
multiline
最初只是RegExp
实例的属性,而不是RegExp
对象的属性。
multiline
现在是一个原型访问器属性
,而不是实例
自己的数据属性
。
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)
目前所有浏览器都支持这个属性获取
source
最初只是RegExp
实例的属性,而不是RegExp
对象的属性。
source
现在是一个原型访问器属性
,而不是实例
自己的数据属性
。
RegExp.prototype.sticky
返回值为一个布尔值
,表示该正则表达式
是否使用了y
标志,即搜索
是否具有粘性
( 仅从正则表达式的 lastIndex
属性表示的索引
处搜索 )。
如果使用了y
修饰符,将返回Boolean
类型的true
,否则将返回false
。
sticky
是一个正则表达式
实例的只读属性
。
特性名 | 特性值 |
---|---|
writable | false |
enumerable | false |
configurable | false |
((log) => {
const regex1 = /foo/y;
log(regex1.sticky); // true
const regex2 = new RegExp("foo", "y");
log(regex2.sticky); // true
})(console.log)
目前Chrome
,Edge
和Firefox (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)
RegExp.prototype.unicode
返回值为一个布尔值
,表示该正则表达式
是否使用了u
标志。
如果使用了u
修饰符,将返回Boolean
类型的true
,否则将返回false
。
unicode
是一个正则表达式
实例的只读属性
。
特性名 | 特性值 |
---|---|
writable | false |
enumerable | false |
configurable | false |
((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)
目前Chrome
,Edge
和Firefox (Gecko)
浏览器支持该属性获取。
u
标志开启了多种 Unicode
相关的特性。使用 u
标志,任何 Unicode
代码点的转译
都会被解释
。
注意开启u
标志,最好结合构造函数
进行使用,如果是字面量
的正则表达式
,则内容是不会转译
的。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp