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+');
正規表現における特殊文字
文字クラス | |
---|---|
文字 | 意味 |
. |
(この文字は小数点です) 改行文字( 文字クラス内では、ドットは特別な意味を失ってリテラルのドットにマッチします。 複数行フラグ 例えば、 |
\d |
Basic Latin アルファベットにおける数字 (digit character)にマッチします。 例えば、 |
\D |
Basic Latin アルファベットにおける数字以外の文字にマッチします。 例えば、 |
\w |
アンダースコアを含む、Basic Latin アルファベット からなる任意のアルファベットの文字にマッチします【訳注: w は word から】。 例えば、 |
\W |
Basic Latin アルファベットからなる単語を構成するものではない、あらゆる文字にマッチします。 例えば、 |
\s |
スペース (space)、タブ、改ページ、改行、その他のユニコードでのスペースを含む、単一の空白文字にマッチします。 例えば、 |
\S |
空白以外の単一の文字にマッチします。 例えば、 |
\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 |
例えば、 |
\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 進表現) で表される文字にマッチします。 |
\ |
通常は文字通りに扱われる文字に対して、次の文字は特殊であり、文字通り解釈させないように指示します。 例えば、 あるいは、 通常は特殊文字として扱われる文字に対して、 次の文字は特殊文字ではなく、文字通りに解釈するように指示します。 例えば、"*" は直前の文字の 0 回以上の出現にマッチする特別な文字です。つまり、 |
文字集合 | |
文字 | 意味 |
[xyz] |
文字の集合。囲まれた文字のどんな 1 文字にもマッチします。ハイフンを用いて文字の範囲を指定することができます。ただしハイフンが角括弧でくくられた文字の先頭または末尾にある場合は、通常の文字として文字集合に含まれている、リテラルのハイフンになります。 例えば、 |
|
文字の集合の否定または補集合。つまり、括弧で囲まれていないどんな文字にもマッチします。ハイフンを用いて文字の範囲を指定することができます。ただしハイフンが角括弧でくくられた文字の先頭または末尾にある場合は、通常の文字として文字集合に含まれている、リテラルのハイフンになります。 例えば、 |
代替 | |
文字 | 意味 |
x|y |
例えば、 |
境界 | |
文字 | 意味 |
^ |
入力の始まりにマッチします。複数行フラグが真に設定されている場合、改行文字の直後にもマッチします。 例えば、 |
$ |
入力の終端にマッチします。複数行フラグが真に設定されている場合、改行文字の直前にもマッチします。 例えば、 |
\b |
文字とスペースの間のような、幅が 0 の 単語の区切り (word boundary)にマッチします。( 例えば、 |
\B |
2 つの文字の間や 2 つのスペースの間のような、幅が 0 の単語の区切りではない箇所にマッチしまします。 例えば、 |
グループ化および後方参照 | |
文字 | 意味 |
(x) |
例えば、 キャプチャグループは左括弧の順番に応じて、1 から番号が割り当てられます。マッチした部分文字列は、マッチ結果の配列の要素 キャプチャグループは、パフォーマンス面で不利です。マッチした部分文字列を再び呼び出す必要がなければ、キャプチャグループは使用しないようにしましょう (後述)。 |
\n |
例えば、 |
(?:x) |
x にマッチしますが、マッチしたものを記憶しません。これはキャプチャしないグループ (non-capturing groups)と呼ばれます。マッチした部分文字列は、マッチ結果の配列の要素 [1], ..., [n] と、あらかじめ定義された RegExp オブジェクトのプロパティ $1, ..., $9 からは参照することができません。 |
量指定子 | |
文字 | 意味 |
x* |
直前のアイテム x の 0 回以上の繰り返しにマッチします。 例えば、 |
x+ |
直前のアイテム x の 1 回以上の繰り返しにマッチします。 例えば、 |
x? |
直前のアイテム x の 0 回か 1 回の繰り返しにマッチします。 例えば、
|
x{n} |
例えば、 |
x{n,} |
例えば、 |
x{n,m} |
例えば、 |
|
前述の 例えば、
|
アサーション | |
文字 | 意味 |
x(?=y) |
例えば、/ |
x(?!y) |
例えば、 |
プロパティ
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)かどうかのフラグ。
メソッド
非推奨の 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 = 'https://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)。