RegExp.prototype.sticky

基线 广泛可用

此功能已得到良好建立,并且可在许多设备和浏览器版本上运行。它已在浏览器中可用,自 2015 年 7 月.

sticky 的访问器属性 RegExp 实例返回正则表达式是否使用 y 标志。

试试看

描述

如果使用了 y 标志,则 RegExp.prototype.sticky 的值为 true;否则为 falsey 标志表示正则表达式仅尝试从 lastIndex 属性指示的索引匹配目标字符串(并且与全局正则表达式不同,不尝试从任何后面的索引匹配)。

sticky 的设置访问器为 undefined。无法直接更改此属性。

对于粘性正则表达式和 全局 正则表达式

  • 它们从 lastIndex 开始匹配。
  • 当匹配成功时,lastIndex 将提前到匹配的末尾。
  • lastIndex 超出当前匹配字符串的范围时,lastIndex 将重置为 0。

但是,对于 exec() 方法,匹配失败时的行为有所不同

  • 当在粘性正则表达式上调用 exec() 方法时,如果正则表达式在 lastIndex 处无法匹配,则正则表达式会立即返回 null 并将 lastIndex 重置为 0。
  • 当在全局正则表达式上调用 exec() 方法时,如果正则表达式在 lastIndex 处无法匹配,它会尝试从下一个字符开始匹配,依此类推,直到找到匹配或到达字符串末尾。

对于 exec() 方法,既是粘性又是全局的正则表达式的行为与粘性和非全局正则表达式的行为相同。因为 test()exec() 的简单包装器,所以 test() 也将忽略全局标志并执行粘性匹配。但是,由于许多其他方法对全局正则表达式的行为进行了特殊处理,因此通常情况下,全局标志与粘性标志正交。

示例

使用带有粘性标志的正则表达式

js
const str = "#foo#";
const regex = /foo/y;

regex.lastIndex = 1;
regex.test(str); // true
regex.lastIndex = 5;
regex.test(str); // false (lastIndex is taken into account with sticky flag)
regex.lastIndex; // 0 (reset after match failure)

锚定粘性标志

在多个版本中,Firefox 的 SpiderMonkey 引擎在 ^ 断言和粘性标志方面存在 错误,该错误允许以 ^ 断言开头并使用粘性标志的表达式在不应该匹配时匹配。该错误是在 Firefox 3.6(具有粘性标志但没有错误)之后的一段时间内引入的,并在 2015 年修复。也许是因为这个错误,规范 特别指出 了以下事实:

即使 y 标志与模式一起使用,^ 也始终只匹配 输入 的开头,或者(如果 rer.[[Multiline]] 为 true)匹配行的开头。

正确行为的示例

js
const regex = /^foo/y;
regex.lastIndex = 2;
regex.test("..foo"); // false - index 2 is not the beginning of the string

const regex2 = /^foo/my;
regex2.lastIndex = 2;
regex2.test("..foo"); // false - index 2 is not the beginning of the string or line
regex2.lastIndex = 2;
regex2.test(".\nfoo"); // true - index 2 is the beginning of a line

规范

规范
ECMAScript 语言规范
# sec-get-regexp.prototype.sticky

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅