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

仕様書

仕様書
ECMAScript Latest Draft (ECMA-262)
RegExp.prototype.sticky の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
stickyChrome 完全対応 49Edge 完全対応 13Firefox 完全対応 3IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 4Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 あり
Anchored sticky flag behavior per ES2015Chrome 完全対応 49Edge 完全対応 13Firefox 完全対応 44IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 44Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs ?
Prototype accessor property (ES2015)Chrome 完全対応 49Edge 完全対応 13Firefox 完全対応 38IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 38Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 あり

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明

関連情報