RegExp

RegExp オブジェクトは、パターンでテキストを検索するために使用します。

正規表現を詳しく知りたい方は JavaScript ガイド正規表現 を参考にしてください。

解説

リテラル記法とコンストラクター

RegExp オブジェクトを生成するには二通りの方法があります。リテラル記法コンストラクターです。

  • リテラル記法は引数をスラッシュで囲み、引用符は使用しません。
  • コンストラクター関数の引数はスラッシュで囲むのではなく、引用符を使用します。

以下の三つの式は、同じ正規表現を生成します。

/ab+c/i
new RegExp(/ab+c/, 'i') // リテラル記法
new RegExp('ab+c', 'i') // コンストラクター

リテラル記法では、正規表現が評価されるときにコンパイルを行います。正規表現が変化しない場合は、リテラル記法を使用してください。例えばループ内で使用する正規表現を生成するためにリテラル記法を使用すると、反復処理のたびに正規表現を再コンパイルすることはありません。

new RegExp('ab+c') といった正規表現オブジェクトのコンストラクターは、実行時に正規表現をコンパイルします。正規表現パターンが変わることがわかっている場合や、パターンが不明でありユーザー入力など別のソースからパターンを取得する場合は、コンストラクター関数を使用してください。

コンストラクターのフラグ

ECMAScript 6 より、第 1 引数が RegExp で第 2 引数に flags を指定する場合 (new RegExp(/ab+c/, 'i')) に TypeError ("can't supply flags when constructing one RegExp from another") が発生しません。代わりに、引数を元に新たな RegExp が生成されます。

コンストラクター関数を使用する場合は、通常の文字エスケープ規則 (文字列内に特殊文字が含まれるとき、前に \ を付加する) が必須です。

例えば、以下 2 つの構文は同等です。

let re = /\w+/
let re = new RegExp('\\w+')

Perl 風の RegExp プロパティ

RegExp のプロパティのいくつかは、長い名前と短い (Perl 風の) 名前があります。 Both names always refer to the same value. (Perl is the programming language from which JavaScript modeled its regular expressions.). See also deprecated RegExp properties.

コンストラクター

RegExp()
新しい RegExp オブジェクトを生成します。

静的プロパティ

get RegExp[@@species]
派生オブジェクトを生成するために使用されるコンストラクター関数です。
RegExp.lastIndex
次のマッチングを開始する位置です。

インスタンスプロパティ

RegExp.prototype.flags
RegExp オブジェクトのフラグから成る文字列です。
RegExp.prototype.dotAll
. が改行文字にマッチするかどうか。
RegExp.prototype.global
対象文字列で可能なすべてのマッチに対して正規表現をテストするか、それとも、最初のマッチに対してのみテストするどうかのフラグです。
RegExp.prototype.ignoreCase
文字列でのマッチを適用する際に、大文字と小文字の違いを無視するかどうかのフラグです。
RegExp.prototype.multiline
複数行に渡って文字列を検索するかどうかのフラグです。
RegExp.prototype.source
パターンのテキストです。
RegExp.prototype.sticky
検索が先頭固定 (sticky) であるかどうかのフラグです。
RegExp.prototype.unicode
Unicode 機能が有効かどうかのフラグです。

インスタンスメソッド

RegExp.prototype.compile()
スクリプトの実行中に正規表現を (再) コンパイルします。
RegExp.prototype.exec()
その文字列のパラメータでのマッチのための検索を実行します。
RegExp.prototype.test()
その文字列のパラメータでのマッチのためのテストをします。
RegExp.prototype.toString()
特定のオブジェクトを表す文字列を返します。Object.prototype.toString() メソッドを上書きします。
RegExp.prototype[@@match]()
与えられた文字列とのマッチを行い、マッチ結果を返します。
RegExp.prototype[@@matchAll]()
文字列に対して正規表現で一致したものをすべて返します。
RegExp.prototype[@@replace]()
与えられた文字列のマッチを新しい部分文字列で置き換えます。
RegExp.prototype[@@search]()
与えられた文字列でマッチを検索し、文字列で見つかったパターンのインデックスを返します。
RegExp.prototype[@@split]()
文字列を部分文字列に分割し、指定された文字列を配列に分割します。

正規表現を使用したデータ形式の変更

以下のスクリプトは、String インスタンスの replace() メソッドを使用して、 first last 形式のフォーマットでの名前にマッチさせ、last, first 形式のフォーマットで出力しています。

置換テキスト中で、そのスクリプトは、$1$2 を使用して、それぞれ対応する正規表現パターンでマッチする括弧がキャプチャした結果を指定しています。

let re = /(\w+)\s(\w+)/
let str = 'John Smith'
let newstr = str.replace(re, '$2, $1')
console.log(newstr)

これは、 "Smith, John" と表示します。

正規表現を使用したさまざまな行末/行の終端/改行での行の分割

既定の行末文字は、プラットフォーム (Unix、Windows など) によって異なります。この例で実行する行分割は、あらゆるプラットフォームで動作します。

let text = 'Some text\nAnd some more\r\nAnd yet\rThis is the end'
let lines = text.split(/\r\n|\r|\n/)
console.log(lines) // logs [ 'Some text', 'And some more', 'And yet', 'This is the end' ]

正規表現内のパターンの順序が重要であることに注意してください。

複数行で正規表現を使用する

let s = 'Please yes\nmake my day!'

s.match(/yes.*day/);
// null 

s.match(/yes[^]*day/);
// Returns ["yes\nmake my day"]

sticky フラグ付きの正規表現の使用

sticky フラグは、対象文字列で RegExp.prototype.lastIndex からマッチングを試みることにより、正規表現の sticky マッチングを実行することを示します。

let str = '#foo#'
let 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 フラグと global フラグの違い

sticky フラグ y を付けると、次の一致は lastIndex の位置で行われるのに対し、グローバルフラグ g を付けると、検索は lastIndex の位置から始められます。

re = /\d/y;
while (r = re.exec("123 456")) console.log(r, "AND re.lastIndex", re.lastIndex);

// [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1
// [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2
// [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3
//   ... and no more match.

グローバルフラグ g を付けると、3桁だけでなく、6桁すべてが一致します。

正規表現と Unicode 文字

上の表にもある通り、\w\W は ASCII 基本文字にのみマッチします。具体的には a から zA から Z0 から 9 および _ です。

キリル語やヘブライ語で使われるような非 ASCII 文字にマッチさせるには \uhhhh 形式 (hhhh の部分は 16進表記の Unicode 値) を使ってください。

この例は、文字列全体から Unicode 文字列だけを抜き出す方法を示しています。

let text = 'Образец text на русском языке'
let regex = /[\u0400-\u04FF]+/g

let match = regex.exec(text)
console.log(match[0])        // logs 'Образец'
console.log(regex.lastIndex) // logs '7'

let match2 = regex.exec(text)
console.log(match2[0])       // logs 'на' [did not log 'text']
console.log(regex.lastIndex) // logs '15'

// and so on

Unicode プロパティエスケープ機能は \p{scx=Cyrl} のように単純な表記を可能にする解決策を導入しています。スクリプト別の完全な Unicode コードブロック (範囲) を知ることができる外部リソースも、 Regexp-Unicode-block などがあります。

URL からのサブドメイン名の抽出

let url = 'http://xxx.domain.com'
console.log(/[^.]+/.exec(url)[0].substr(7)) // logs 'xxx'

仕様書

仕様書
ECMAScript (ECMA-262)
RegExp の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
RegExpChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
RegExp() constructorChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
compile
非推奨
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 6Safari 完全対応 3.1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 2Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
dotAllChrome 完全対応 62Edge 完全対応 79Firefox 完全対応 78IE 未対応 なしOpera 完全対応 49Safari 完全対応 12WebView Android 完全対応 62Chrome Android 完全対応 62Firefox Android 未対応 なしOpera Android 完全対応 46Safari iOS 完全対応 12Samsung Internet Android 完全対応 8.0nodejs 完全対応 8.10.0
完全対応 8.10.0
完全対応 8.3.0
無効
無効 From version 8.3.0: this feature is behind the --harmony runtime flag.
execChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
flagsChrome 完全対応 49Edge 完全対応 79Firefox 完全対応 37IE 未対応 なしOpera 完全対応 39Safari 完全対応 9WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 37Opera Android 完全対応 41Safari iOS 完全対応 9Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0
globalChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
ignoreCaseChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
RegExp.input ($_)
非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 15Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 14Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
lastIndexChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
RegExp.lastMatch ($&)
非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 10.5Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 11Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
RegExp.lastParen ($+)
非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 10.5Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 11Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
RegExp.leftContext ($`)
非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 8Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
lookbehind assertions ((?<= ) and (?<! ))Chrome 完全対応 62Edge 完全対応 79Firefox 完全対応 78IE 未対応 なしOpera 完全対応 49Safari 未対応 なしWebView Android 完全対応 62Chrome Android 完全対応 62Firefox Android 未対応 なし
補足
未対応 なし
補足
補足 See bug 1225665.
Opera Android 完全対応 46Safari iOS 未対応 なしSamsung Internet Android 完全対応 8.0nodejs 完全対応 8.10.0
multilineChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
RegExp.$1-$9Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
Named capture groupsChrome 完全対応 64Edge 完全対応 79Firefox 完全対応 78IE 未対応 なしOpera 完全対応 51Safari 完全対応 11.1WebView Android 完全対応 64Chrome Android 完全対応 64Firefox Android 未対応 なしOpera Android 完全対応 47Safari iOS 完全対応 11.3Samsung Internet Android 完全対応 9.0nodejs 完全対応 10.0.0
完全対応 10.0.0
完全対応 8.3.0
無効
無効 From version 8.3.0: this feature is behind the --harmony runtime flag.
Unicode property escapes (\p{...})Chrome 完全対応 64Edge 完全対応 79Firefox 完全対応 78IE 未対応 なしOpera 完全対応 51Safari 完全対応 11.1WebView Android 完全対応 64Chrome Android 完全対応 64Firefox Android 未対応 なしOpera Android 完全対応 47Safari iOS 完全対応 11.3Samsung Internet Android 完全対応 9.0nodejs 完全対応 10.0.0
完全対応 10.0.0
完全対応 8.3.0
無効
無効 From version 8.3.0: this feature is behind the --harmony runtime flag.
RegExp.rightContext ($')
非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 8Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
sourceChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
stickyChrome 完全対応 49Edge 完全対応 13Firefox 完全対応 3IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 4Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 あり
testChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
toSource
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 未対応 1 — 74
補足
未対応 1 — 74
補足
補足 Starting in Firefox 74, toSource() is no longer available for use by web content. It is still allowed for internal and privileged code.
IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 4Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
toStringChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 5Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
unicodeChrome 完全対応 50Edge 完全対応 12
補足
完全対応 12
補足
補足 Case folding is implemented in version 13
Firefox 完全対応 46IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android 完全対応 50Chrome Android 完全対応 50Firefox Android 完全対応 46Opera Android 完全対応 37Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 あり
@@matchChrome 完全対応 50Edge 完全対応 13Firefox 完全対応 49IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android 完全対応 50Chrome Android 完全対応 50Firefox Android 完全対応 49Opera Android 完全対応 37Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0
@@matchAllChrome 完全対応 73Edge 完全対応 79Firefox 完全対応 67IE 未対応 なしOpera 完全対応 60Safari 完全対応 13WebView Android 完全対応 73Chrome Android 完全対応 73Firefox Android 完全対応 67Opera Android 完全対応 52Safari iOS 完全対応 13Samsung Internet Android 完全対応 5.0nodejs 完全対応 12.0.0
@@replaceChrome 完全対応 50Edge 完全対応 79Firefox 完全対応 49IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android 完全対応 50Chrome Android 完全対応 50Firefox Android 完全対応 49Opera Android 完全対応 37Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0
@@searchChrome 完全対応 50Edge 完全対応 13Firefox 完全対応 49IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android 完全対応 50Chrome Android 完全対応 50Firefox Android 完全対応 49Opera Android 完全対応 37Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0
@@speciesChrome 完全対応 50Edge 完全対応 13Firefox 完全対応 49IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android 完全対応 50Chrome Android 完全対応 50Firefox Android 完全対応 49Opera Android 完全対応 37Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.5.0
完全対応 6.5.0
完全対応 6.0.0
無効
無効 From version 6.0.0: this feature is behind the --harmony runtime flag.
@@splitChrome 完全対応 50Edge 完全対応 79Firefox 完全対応 49IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android 完全対応 50Chrome Android 完全対応 50Firefox Android 完全対応 49Opera Android 完全対応 37Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0

凡例

完全対応  
完全対応
未対応  
未対応
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。
非推奨。新しいウェブサイトでは使用しないでください。
非推奨。新しいウェブサイトでは使用しないでください。
実装ノートを参照してください。
実装ノートを参照してください。
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

Firefox 固有の注意事項

Firefox 34 より、量指定子を伴うキャプチャグループが動作を妨げている場合に、キャプチャグループにマッチしたテキストが空文字列ではなく undefined になります:

// Firefox 33 以前
'x'.replace(/x(.)?/g, function(m, group) {
  console.log("'group:" + group + "'");
}); 
// 'group:'

// Firefox 34 以降
'x'.replace(/x(.)?/g, function(m, group) {
  console.log("'group:" + group + "'");
}); 
// 'group:undefined'

ウェブの互換性のため RegExp.$N は引き続き、 undefined ではなく空文字列を返します (bug 1053944)。

関連情報