概要

RegExp コンストラクタは、パターンに従ったテキストにマッチする正規表現オブジェクトを生成します。

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

構文

リテラル記法およびコンストラクタ記法を使用できます:

/pattern/flags
new RegExp(pattern[, flags])

引数

pattern
正規表現のテキスト。
flags
フラグは、次の値を任意の組み合わせで指定できます。:
g
グローバルなマッチ
i
大文字・小文字の無視
m
複数行に渡るマッチ。先頭および終端を示す文字 (^ や $) が、複数の行で機能します (すなわち、入力文字列全体の先頭および終端だけでなく各々の行 (\n や \r で区切られる) の先頭および末尾にマッチします)。
u
Unicode。パターンを Unicode コードポイントの羅列として扱います。
y
先頭固定 (sticky)。対象文字列中の正規表現の lastIndex プロパティによって示された位置からのみマッチするようになります(それより後の位置からのマッチは試みません)。

説明

RegExp オブジェクトを作成する場合、正規表現リテラルを利用する方法とコンストラクタ関数を利用する方法の2通りがあります。正規表現リテラルではクォートは必要ありませんが、コンストラクタ関数を利用する場合はクォートが必要になります。以下は例では、同じ正規表現オブジェクトが作成されます。:

/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 が発生しません。代わりに、引数を元に新たな RegExp を生成します。

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

var re = /\w+/;
var re = new RegExp('\\w+');

正規表現における特殊文字

文字クラス
文字 意味
.

(この文字は小数点です) 改行文字(\n\r\u2028、あるいは、\u2029)を除いたあらゆる 1 文字にマッチします。

文字クラス内では、ドットは特別な意味を失ってリテラルのドットにマッチします。

複数行フラグ m はドットの動作を変更しませんので注意してください。よって複数行にまたがるパターンをマッチさせるために文字集合 [^] を使用でき (当然ながら、古いバージョンの IE を考慮しない場合)、これは新しい行を含むあらゆる文字にマッチします。

例えば、/.y/ は "yes make my day" の "my" と "ay" にはマッチしますが、"yes" にはマッチしません。

\d

Basic Latin アルファベットにおける数字 (digit character)にマッチします。[0-9] と同じです。

例えば、/\d/ あるいは /[0-9]/ は、 "B2 is the suite number" の '2' にマッチします。

\D

Basic Latin アルファベットにおける数字以外の文字にマッチします。[^0-9] と同じです。

例えば、/\D/ あるいは /[^0-9]/ は、"B2 is the suite number" の 'B' にマッチします。

\w

アンダースコアを含む、Basic Latin アルファベット からなる任意のアルファベットの文字にマッチします【訳注: w は word から】[A-Za-z0-9_] と同等です。

例えば、/\w/ は、"apple" の 'a' 、"$5.28" の '5' 、"3D" の '3' にマッチします。

\W

Basic Latin アルファベットからなる単語を構成するものではない、あらゆる文字にマッチします。[^A-Za-z0-9_] と同等です。

例えば、/\W/ あるいは /[^A-Za-z0-9_]/ は、"50%" の '%' にマッチします。

\s

スペース (space)、タブ、改ページ、改行、その他のユニコードでのスペースを含む、単一の空白文字にマッチします。[ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​-\u200a​\u2028\u2029\u202f\u205f​\u3000\ufeff] と同等です。

例えば、/\s\w*/ は、"foo bar" の ' bar' にマッチします。

\S

空白以外の単一の文字にマッチします。[^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​-\u200a​\u2028\u2029\u202f\u205f​\u3000\ufeff] と同等です。

例えば、/\S\w*/ は "foo bar" の 'foo' にマッチします。

\t 水平タブ (horizontal tab) にマッチします。
\r 行頭復帰(CR) (carriage return) にマッチします。
\n 改行(LF) (linefeed) にマッチします【訳注: n は newline から】
\v 垂直タブ (vertical tab) にマッチします。
\f 改ページ(FF) (form-feed) にマッチします。
[\b] バックスペース (backspace)にマッチします。(\b と混同しないでください)
\0 NUL 文字【訳注: NUL は null の略であり、0 を意味するドイツ語】にマッチします。この後ろに他の数字を続けてはいけません。
\cX

X には A - Z のどれか 1 文字が入ります。ある文字列中の制御文字 (contorol character)にマッチします。

例えば、/\cM/ は、ある文字列中の control-M にマッチします。

\xhh hh(2 桁の 16 進表現 (two hexadecimal digits))で表される文字にマッチします【訳注: x は hexadecimal から】
\uhhhh hhhh( 4 桁の 16 進表現)で表される UTF-16 コード単位にマッチします【訳注: u は Unicode の u から。つまり、これは Unicode エスケープシーケンスです】
\u{hhhh} または \u{hhhhh} (u フラグを設定した場合に限る) Unicode の値 U+hhhh または U+hhhhh (16 進表現) で表される文字にマッチします。
\

通常は文字通りに扱われる文字に対して、次の文字は特殊であり、文字通り解釈させないように指示します。

例えば、/b/ は 'b' という文字にマッチします。"b" の前に、バックスラッシュを置き、/\b/ とすると、その文字は単語の区切りにマッチすることを意味する特殊文字になります。

あるいは、

通常は特殊文字として扱われる文字に対して、 次の文字は特殊文字ではなく、文字通りに解釈するように指示します。

例えば、"*" は直前の文字の 0 回以上の出現にマッチする特別な文字です。つまり、/a*/ は "a" の 0 回以上の出現にマッチすることを意味します。* という文字そのものにマッチさせるには、直前にバックスラッシュを付加します。つまり、/a\*/ は 'a*' にマッチします。

文字集合
文字 意味
[xyz]
[a-c]

文字の集合。囲まれた文字のどんな 1 文字にもマッチします。ハイフンを用いて文字の範囲を指定することができます。ただしハイフンが角括弧でくくられた文字の先頭または末尾にある場合は、通常の文字として文字集合に含まれている、リテラルのハイフンになります。

例えば、[abcd][a-d] と同じです。これは "brisket" の 'b' や "chop" の 'c' にマッチします。

[^xyz]
[^a-c]

文字の集合の否定または補集合。つまり、括弧で囲まれていないどんな文字にもマッチします。ハイフンを用いて文字の範囲を指定することができます。ただしハイフンが角括弧でくくられた文字の先頭または末尾にある場合は、通常の文字として文字集合に含まれている、リテラルのハイフンになります。

例えば、[^abc][^a-c] と同じです。これらは、"bacon" の 'o' や "chop" の 'h' のように、最初に見つかった文字にマッチします。

代替
文字 意味
x|y

x または y にマッチします。

例えば、/green|red/ は、"green apple" の 'green' や "red apple" の 'red' にマッチします。

境界
文字 意味
^

入力の始まりにマッチします。複数行フラグが真に設定されている場合、改行文字の直後にもマッチします。

例えば、/^A/ は "an A" の 'A' にはマッチしませんが、 "An A." の最初の 'A' にはマッチします。

$

入力の終端にマッチします。複数行フラグが真に設定されている場合、改行文字の直前にもマッチします。

例えば、/t$/ は "eater" の 't' にはマッチしませんが、"eat" の 't' にはマッチします。

\b

文字とスペースの間のような、幅が 0 の 単語の区切り (word boundary)にマッチします。([\b] と混同しないでください。)

例えば、/\bno/ は、"at noon" の 'no' にマッチし、/ly\b/ は "possibly yesterday" の 'ly' にマッチします。

\B

2 つの文字の間や 2 つのスペースの間のような、幅が 0 の単語の区切りではない箇所にマッチしまします。

例えば、/\Bon/ は、"at noon" の "on" にマッチし、/ye\B/ は "possibly yesterday" の 'ye' にマッチします。

グループ化および後方参照
文字 意味
(x)

x にマッチし、マッチしたものを記憶します。これはキャプチャグループ (capturing groups)と呼ばれます。

例えば、/(foo)/ は、 "foo bar." の 'foo' にマッチし、それを記憶します。

キャプチャグループは左括弧の順番に応じて、1 から番号が割り当てられます。マッチした部分文字列は、マッチ結果の配列の要素 [1], ..., [n] か、あらかじめ定義された RegExp オブジェクトのプロパティ $1, ..., $9 から参照することができます。

キャプチャグループは、パフォーマンス面で不利です。マッチした部分文字列を再び呼び出す必要がなければ、キャプチャグループは使用しないようにしましょう (後述)。

\n

n には正の整数が入ります。正規表現内で (左括弧を数えて) n 番目の括弧でくくられた部分に該当する部分文字列を後方参照します。

例えば、/apple(,)\sorange\1/ は "apple, orange, cherry, peach" の 'apple, orange,' にマッチします。具体的なサンプルをこの表の後に掲載しています。

(?:x) x にマッチしますが、マッチしたものを記憶しません。これはキャプチャしないグループ (non-capturing groups)と呼ばれます。マッチした部分文字列は、マッチ結果の配列の要素 [1], ..., [n] と、あらかじめ定義された RegExp オブジェクトのプロパティ $1, ..., $9 からは参照することができません。
量指定子
文字 意味
x*

直前のアイテム x の 0 回以上の繰り返しにマッチします。

例えば、/bo*/ は "A ghost booooed" の 'boooo' や "A bird warbled" の 'b' にはマッチしますが、"A goat grunted" のどんな文字にもマッチしません。

x+

直前のアイテム x の 1 回以上の繰り返しにマッチします。{1,} と等価です。

例えば、/a+/ は "candy" の 'a' や、"caaaaaaandy" のすべての a にマッチします。

x?

直前のアイテム x の 0 回か 1 回の繰り返しにマッチします。

例えば、/e?le?/ は "angel" の 'el' や "angle" の 'le' にマッチします。

*+?{} といった量指定子の直後に使用した場合は、非欲張り (non-greedy)量指定子(最小回数にマッチ【訳注: スキップ優先】)となります。これはデフォルトのそれらとは逆であり、デフォルトのそれらは、貪欲 (greedy)量指定子(最大回数にマッチ【訳注: 繰り返し優先】)です。

x{n}

n には正の整数が入ります。直前のアイテム x がちょうど n 回現れているものにマッチします。

例えば、/a{2}/ は、"candy" の 'a' にはマッチしませんが、"caandy" の全ての a にマッチします。また、"caaandy" の最初の 2 つの a にマッチします。

x{n,}

n には正の整数が入ります。直前のアイテム x が少なくとも n 回現れているものにマッチします。

例えば、/a{2,}/ は、"candy" の 'a' にはマッチしませんが、"caandy" や "caaaaaaandy" の全ての a にマッチします。

x{n,m}

nm には正の整数が入ります。直前のアイテム x が少なくとも n 回、多くとも m 回現れているものにマッチします。

例えば、/a{1,3}/ は、"cndy" のどんな文字にもマッチせず、"candy" の 'a' 、 "caandy" の 2 つの a 、 "caaaaaaandy" の 3 つの a にマッチします。"caaaaaaandy" にマッチするのは、元の文字列に a が 4 つ以上あるにも関わらず、"aaa" であることに注意してください。

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

前述の *+?{...} と同様に直前のアイテム x にマッチしますが、最小の範囲にマッチします。

例えば、/<.*?>/ は "<foo> <bar>" の "<foo>" にマッチしますが、/<.*>/ は "<foo> <bar>" にマッチします。

? を伴わない量指定子は、貪欲と呼ばれます。? を伴うものは、"非欲張り" と呼ばれます。

アサーション
文字 意味
x(?=y)

x に続いて y が現れる場合にのみ、x にマッチします【訳注: 肯定的前方先読み】

例えば、/Jack(?=Sprat)/ は、 'Jack' に続いて 'Sprat' が現れる場合にのみ、'Jack' にマッチします。
/Jack(?=Sprat|Frost)/は、'Jack' に続いて 'Sprat' か 'Frost' が現れる場合にのみ、'Jack' にマッチします。しかし、 'Sprat' も 'Frost' もマッチした結果には含まれません。

x(?!y)

x に続いて y が現れない場合にのみ、x にマッチします【訳注: 否定的前方先読み】

例えば、/\d+(?!\.)/ ある数に続いて小数点が現れない場合にのみ、その数字にマッチします。
/\d+(?!\.)/.exec('3.141') は、141 にはマッチしますが、3.141 にはマッチしません。

プロパティ

RegExp.prototype
全てのオブジェクトへプロパティを追加することを許可します。
RegExp.length
RegExp.length の値は 2 です。
get RegExp[@@species]
派生オブジェクトを生成するために使用するコンストラクタ関数です。
RegExp.lastIndex
次のマッチングを開始する位置です。

メソッド

RegExp インスタンスから継承されているメソッドについては、RegExp インスタンスのメソッドを参照してください。

グローバル RegExp オブジェクトは、自分自身のメソッドを持っていませんが、プロトタイプチェーンを通していくつかのメソッドを継承しています。

RegExp プロトタイプオブジェクトとインスタンス

プロパティ

非推奨の RegExp プロパティも参照してください。

RegExp プロパティのいくつかは(Perl ライクな)長い名前と短い名前の両方を持っていることに注意してください。【訳注: それらは 1.5 以前のバージョンでの実装であり、非推奨の機能です。】どちらの名前でも常に同じ値を参照します。Perl は JavaScript の正規表現のモデルとなっているプログラミング言語です。

constructor
オブジェクトのプロトタイプを生成する関数を指定します。
global
対象文字列で可能なマッチ全てに対して正規表現をテストするか、それとも、最初のマッチに対してのみテストするどうかのフラグ。
ignoreCase
文字列でのマッチを適用する際に、大文字と小文字の違いを無視するかどうかのフラグ。
lastIndex
次のマッチが始まる位置。
multiline
複数行に渡って文字列を検索するかどうかのフラグ。
source
パターンのテキスト。
sticky
検索が先頭固定 (sticky)かどうかのフラグ。
Object から継承されるプロパティ

メソッド

非推奨の RegExp メソッドも参照してください。

exec
その文字列のパラメータでのマッチのための検索を実行します。
test
その文字列のパラメータでのマッチのためのテストをします。
toSource
特定のオブジェクトを表すオブジェクトリテラルを返します。 この値は新しいオブジェクトを生成するために使うことができます。Object.prototype.toSource メソッドを上書きします。
toString
特定のオブジェクトを表す文字列を返します。Object.prototype.toString メソッドを上書きします。

例: データフォーマットを変更するための正規表現の使用

以下のスクリプトは、String インスタンスから継承された replace() メソッドを使用して、first last 形式のフォーマットでの名前にマッチさせ、last, first 形式のフォーマットで出力しています。置換テキスト中で、そのスクリプトは、$1$2 を使用して、それぞれ対応する正規表現パターンでマッチする括弧がキャプチャした結果を指定しています。

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

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

例: 正規表現を使用してさまざまな行末/行の終端/改行で行を分割する

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

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

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

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

var s = 'Please yes\nmake my day!';
s.match(/yes.*day/);
// Returns null
s.match(/yes[^]*day/);
// Returns 'yes\nmake my day'

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

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

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

regex.lastIndex; // 0
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)

例: 正規表現と Unicode 文字

上の表にもある通り、\w\W は ASCII 文字にのみマッチします。具体的には 'a' から 'z' 、'A' から 'Z' 、0 から 9 および '_' です。キリル語やヘブライ語で使われるような非 ASCII 文字にマッチさせるには \uhhhh 形式 ('hhhh' の部分は16進表記の Unicode 値) を使ってください。この例は、文字列全体から Unicode 文字列だけを抜き出す方法をデモしています。

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

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

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

// and so on

各記述言語ごとの完全な Unicode コードブロック (範囲) を知ることができる外部サイトもあります: Regexp-unicode-block 【訳注: 必要な言語をチェックすると文字クラスを組み立ててくれる便利なサイトです。】

例: URL からサブドメインを抽出する

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

仕様

仕様書 策定状況 コメント
ECMAScript 3rd Edition (ECMA-262) 標準 最初期の定義。JavaScript 1.1 で実装。
ECMAScript 5.1 (ECMA-262)
RegExp の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
RegExp の定義
標準 第 1 引数が RegExp で第 2 引数も指定したとき、RegExp で例外が発生しないようになりました。Unicode および sticky フラグを導入。
ECMAScript 2017 Draft (ECMA-262)
RegExp の定義
ドラフト  

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
Sticky フラグ ("y") 39 [1] 3.0 (1.9) 未サポート 未サポート 未サポート
Unicode フラグ ("u") 50 46 (46) ? ? ?
RegExp(RegExp object, flags) で例外が発生しない 未サポート 39 (39) 未サポート 未サポート 未サポート
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)
Sticky フラグ ("y") 未サポート 未サポート 1.0 (1.9) 未サポート 未サポート 未サポート
Unicode フラグ ("u") ? 46.0 (46) ? ? ?
RegExp(RegExp object, flags) で例外が発生しない 未サポート 未サポート 39.0 (39) 未サポート 未サポート 未サポート

[1] flag で制御されています。

Gecko 固有の注意事項

Gecko 34 (Firefox 34 / Thunderbird 34 / SeaMonkey 2.31) より、量指定子を伴うキャプチャグループが動作を妨げている場合に、キャプチャグループにマッチしたテキストが空文字列ではなく 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'

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

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: yyss, mamodayo, h2so5, teoli, cu39, ethertank, Potappo, drry
 最終更新者: yyss,