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