RegExp.prototype.sticky

sticky プロパティは、検索が粘着的 (sticky) である (文字列内の検索を、この正規表現の lastIndex プロパティで示されたインデックスからのみ開始する) かどうかを表します。 sticky は個々の正規表現オブジェクトが持つ読み取り専用のプロパティです。

試してみましょう

RegExp.prototype.sticky のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能

解説

sticky の値は Boolean で、 true ならば "y" フラグが使われており、 false はそれ以外を表します。 "y" フラグは対象文字列において、この正規表現の lastIndex プロパティで示されたインデックスからのみ一致することを示しています (そしてそれ以降のインデックスから一致を調べようとはしません)。 stickyglobal の両方が定義された正規表現では、 global フラグは無視されます。

このプロパティを直接変更することはできません。これは読み取り専用です。

sticky フラグのついた正規表現の使用

var str = '#foo#';
var 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)

アンカーになる sticky フラグ

Firefox の SpiderMonkey エンジンのいくつかのバージョンでは ^ 指定に関するバグがあり、 ^ アサーションで始まり、 sticky フラグを使うことで一致しない式を許可していました。このバグは Firefox 3.6 以降 (それ以前は sticky が実装されていてもバグはありませんでした) で発生し、2015 年に修正されました。 ES2015 の仕様では、おそらくこのバグのために、以下のとおり定められています。

パターンとともに y フラグが使用された場合、 ^ は常に入力の始まりにのみ一致するか、 (multilinetrue の場合) 最初の行に一致します。

以下は正しい挙動の例です。

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

var 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

仕様書

Specification
ECMAScript Language Specification
# sec-get-regexp.prototype.sticky

ブラウザーの互換性

BCD tables only load in the browser

関連情報