JS 正则表达式 sticky

🌙
手机阅读
本文目录结构

sticky 属性反映了搜索是否具有粘性( 仅从正则表达式的 lastIndex 属性表示的索引处搜索 )。sticky 是正则表达式对象的只读属性。

RegExp.prototype.sticky 属性的属性特性:
writable
enumerable
configurable

描述

sticky 的值是 Boolean ,并在“y”标志使用时为真; 否则为假。"y" 标志指示,仅从正则表达式的 lastIndex 属性表示的索引处为目标字符串匹配(并且不会尝试从后续索引匹配)。

你不能直接更改这个属性,它是只读的。

例子

使用带 sticky 标志的正则表达式

var str = '#foo#';
var regex = /foo/y;

regex.lastIndex = 1;
regex.test(str); // true (译注:此例仅当 lastIndex = 1 时匹配成功,这就是 sticky 的作用)
regex.lastIndex = 5;
regex.test(str); // false (lastIndex 被 sticky 标志考虑到,从而导致匹配失败)
regex.lastIndex; // 0 (匹配失败后重置)

锚定的 sticky 标志

火狐的 SpiderMonkey 引擎的几个版本有一个 bug,处理 ^ 断言和 sticky 标志时,会允许使用了 sticky 标志的表达式从 ^ 断言开始匹配,这是不应该的。这个 bug 是在 Firefox 3.6 之后的某个版本引入的(which had the sticky flag but not the bug)并于2015年修复。 可能正因为这个 bug, ES2015 规范 特别指出

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

正确行为的示例:

var regex = /^foo/y;
regex.lastIndex = 2;
regex.test("..foo");   // false - 索引2不是字符串的开始

var regex2 = /^foo/my;
regex2.lastIndex = 2;
regex2.test("..foo");  // false - 索引2不是字符串或行的开始
regex2.lastIndex = 2;
regex2.test(".\nfoo"); // true - 索引2是行的开始

规范

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)RegExp.prototype.sticky Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)RegExp.prototype.sticky Draft  

相关链接

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了