正規表現 (RegExp)

RegExpコンストラクタは、パターンにマッチさせるための正規表現オブジェクトを作成します。

正規表現が何のか学びたいのであれば、 JavaScriptガイドの正規表現チャプターを読んでみてください。

コンストラクタ

リテラルとコンストラクタの表記が可能です。

/pattern/flags;

new RegExp(pattern [, flags]);
引数 説明
pattern

正規表現のテキストを指定します。

flags

指定されると、flagsは下記の値と組み合わせて使用することが可能です。

g
グローバルマッチ。
1つ目だけのマッチを対象にするのでは無く、全体からマッチ対象を探します。
i
イグノアケース。
大文字・小文字の違いを無視してマッチさせます。
m
複数行(マルチライン)。
始端と終端の文字列(^$)を複数行にわたって取り扱います。 (つまり、入力文字全体の始端と終端だけでなく、各行(\nまたは\rで区切られた)の始端と終端にもマッチ)
y
付箋(?スティッキー sticky)。
対象となる文字列での正規表現のlastIndexプロパティが指し示すインデックスからのみにマッチします。 (また、それ以降のマッチを試みません) これは、lastIndexプロパティの値を変更することによって任意の場所で、 "開始場所にのみマッチ"する特殊な文字列"^"の機能を、有効に活用することを出来るようにしてくれます。

説明

RegExpオブジェクトの作成には、リテラル表記とコンストラクタの2つの方法が存在します。 文字列を指し示す際に、リテラル表記での文字列パラメータはクォーテーション記号を使用せず、 一方、コンストラクタ関数へのパラメータではクォーテーション記号を使用します。 そのため、下記の式はどちらも同じ正規表現を生成することになります。

/ab+c/i;
new RegExp("ab+c", "i");

式が評価される際に、リテラル表記は正規表現の編集を提供します。 正規表現が一定に保たれる場合に、リテラル表記を使用するようにしてください。 例えば、もしリテラル表記を使用してループ内で正規表現を構築する場合、 その正規表現は各反復処理で再構築されることはありません。

例えばnew RegExp("ab+c")のような正規表現オブジェクトの構築であれば、 正規表現の実行時に編集をすることが出来ます。 あなたが知りうる正規表現パターンの変更や、あなたが知り得ないユーザー入力のようなパターンを用いる際に、 コンストラクタ関数を使用して下さい。

コンストラクタ関数を使用する際に、通常の文字列エスケープ(特殊文字列前の\)のルールは必須となります。 例えば、下記の2つは同じ結果になります。

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

正規表現での特殊文字

文字クラス
文字 意味
.

(ドット、少数点)
改行文字\n\r\u2028\u2029を除く任意の1文字にマッチします。

mの複数行(マルチライン)フラグは、このドットの振る舞いを変更しないことに注意してください。 複数行にまたいでパターンをマッチさせるのに[^]の文字セットが使用することができ、 改行を含む任意の文字列にマッチします。

ドットの例として例えば、/.y/は"yes make my day"文字列内の、"my"と"ay"にマッチしますが、"yes"にはマッチしません。

\d

基本的なラテンアルファベットの数字(digit)文字にマッチします。 [0-9]と同等です。

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

\D

基本的なラテンアルファベットの数字文字では無い、任意の文字にマッチします。 [^0-9]と同等です。

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

\w

基本的なラテンアルファベットの任意の文字(word)にマッチします。アンダースコアも含まれます。 [A-Za-z0-9_]と同等です。

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

\W

基本的なラテンアルファベットでは無い任意の文字にマッチします。 [^A-Za-z0-9_]と同等です。

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

\s

スペース、タブ、フォームフィード、ラインフィード、その他のUnicodeのスペースを含む、単一の空白文字にマッチします。 [ \t\r\n]と同等です。

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

\S

空白以外の単一の文字列にマッチします。 [^ \t\r\n]と同等です。

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

\t

タブにマッチします。

\r

キャリッジリターン(Carriage Return)の改行コードにマッチします。

\n

ラインフィード(Line Feed、New Line)の改行コードにマッチします。

\v

垂直タブにマッチします。

\f

フォームフィードにマッチします。

[\b]

バックスペースにマッチします。(\bと混同しないでください。)

\0

NUL(null)文字にマッチします。 この後に数値を続けてはいけません。

\cX

XはAからZの文字です。 文字列内の制御文字と一致します。

例えば、/\cM/は文字列内のCtrl-Mと一致します。

\xhh

hhコード(2桁の16進数(hexadecimal))の文字にマッチします。

\uhhhh

Unicode値hhhh(4桁の16進数)の文字にマッチします。

\

通常はリテラルとして扱われる次に来る文字を特別なものとし、リテラルとして解釈をしないという事を指定します。

例えば、/b/は文字'b'にマッチします。 /\b/としてbの前にバックスラッシュを置くことで、文字は単語の境界にマッチする特別な意味を持つようになります。

または、

通常は特別に扱われる次に来る文字を特別では無いものとし、リテラル文字として解釈するという事を指定します。

例えば、*は、先行する文字0個以上にマッチする特別な文字で、 /a*/は0個以上の"a"にマッチするという意味になります。 *のリテラル値としてマッチするために、バックスラッシュをその文字の先に指定します。 例えば、/a\*/は'a*'にマッチします。

文字セット
文字 意味
[xyz]

文字セットです。 括弧内の文字のいずれか1つにマッチします。 ハイフン(-)を使用することによって、文字範囲を指定することが出来ます。

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

[^xyz]

文字セットを無効または補完します。 これは括弧内に無い何らかの文字にマッチします。 ハイフン(-)を使用することによって、文字範囲を指定することが出来ます。

例えば、[^abc]は、[^a-c]と同じです。 これは"bacon"内の初めの'o'、"chop"内の初めの'h'にマッチします。

境界
文字 意味
^

入力の始端にマッチします。 もしm(複数行)フラグが設定されていれば、改行文字直後にもマッチします。

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

$

入力の末端にマッチします。 もしm(複数行)フラグが設定されていれば、改行文字直前にもマッチします。

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

\b

文字とスペースの間のような、単語の境界(幅がゼロであるもの)にマッチします。([\b]と混同しないでください。)

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

\B

2つの文字の間、2つのスペースの間のような単語の境界では無い部分(幅がゼロであるもの)にマッチします。

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

グループと後方参照
文字 意味
(x)

xにマッチし、マッチしたものを記憶します。 これらはキャプチャリング括弧(capturing parentheses)と呼ばれます。

例えば、/(foo)/は"foo bar."内の'foo'にマッチしてそれを記憶します。 マッチした文字列は、マッチ結果の配列要素[1]…[n]、または予め定義したRegExpオブジェクトのプロパティ$1…$9として再呼び出しすることが出来ます。

グループのキャプチャはパフォーマンスを低下させます。 もし、マッチした文字列の再呼び出しの必要が無いのであれば、キャプチャリング括弧を使用しない方が良いでしょう(下記参照)。

\n

nには正の整数を指定します。 正規表現内の左の括弧からカウントして、n番目の括弧の最後の文字列にマッチする後方参照です。

例えば、/apple(,)\sorange\1/は"apple, orange, cherry, peach."内の'apple, orange,'にマッチします。 より詳しい例を、この表の後に説明します。

(?:x)

xにマッチしますが、それを記憶しません。 これは非キャプチャリング括弧(non-capturing parentheses)と呼ばれます。 マッチした文字列は、マッチ結果の配列要素[1]…[n]、 または予め定義したRegExpオブジェクトのプロパティ$1…$9として再呼び出しすることが出来ません。

数量
文字 意味
*

この記号の前にある文字、0個以上にマッチします。

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

+

この記号の前にある文字1個以上にマッチします。 {1,}と同等です。

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

*?
+?

上記の*+のようにマッチしますが、このマッチは可能な限り最小になります。

例えば、/".*?"/は'"foo" "bar"'内の'"foo"'にマッチし、 *の背面に?が無い場合のような'"foo" "bar"'にはマッチをしません。

?

この記号の前にある文字0個または1個にマッチします。

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

もし、数量を表す*+?{}等の直後に使用されたのであれば、 貪欲にマッチ(最大のマッチ)するデフォルトに反して、貪欲では無いマッチ(最小のマッチ)になります。

先読みアサーションでも使用され、この表の(?=)(?!)(?:)で説明します。

x(?=y)

その後にyが続くxにのみマッチします。 例えば、/Jack(?=Sprat)/は、その後に'Sprat'が続く'Jack'にのみマッチします。 /Jack(?=Sprat|Frost)/では、その後に'Sprat'または'Frost'が続く'Jack'にのみマッチします。 ただし、'Sprat'も'Frost'もマッチ結果の一部になりません。

x(?!y)

その後にyが続かないxのみにマッチします。 例えば、/\d+(?!\.)/は、その後に少数点が続かない数値にのみマッチします。

/\d+(?!\.)/.exec("3.141")は、141にはマッチしますが、3.141にはマッチしません。

x|y

xまたはyのどちらかにマッチします。 例えば、/green|red/は"green apple"内の'green'と、"red apple."内の'red'にマッチします。

{n}

nには正の整数を指定します。 この記号の前の文字の、正確なn回数の出現に対してマッチします。

例えば、/a{2}/は"candy,"内の'a'にマッチしませんが、 "caandy,"内の全ての'a'にマッチし、"caaandy."であれば最初の2文字の'a'にマッチします。

{n,}

nは正の整数です。 この記号の前の文字に、少なくともn回数の出現に対してマッチします。

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

{n,m}

nとmは正の整数です。 この前の文字が少なくともn回最大、m回の出現に対してマッチします。

例えば、/a{1,3}/は"cndy"ではマッチせず、"candy,"では'a'、"caandy,"では2つの'a'、 "caaaaaaandy"では最初の3つの'a'にマッチします。 "caaaaaaandy"にマッチさせる場合、元の文字列には3つより多くの'a'が含まれていますが、マッチするのは"aaa"であることに注意してください。

プロパティとメソッド

  • プロパティ

  • .lastIndex

    読み込み/書き込みが可能な正規表現の数値プロパティで、次のマッチが開始されるインデックスが指定されています。

  • プロパティ(prototype)

  • .global

    "g"フラグが正規表現で使用されているか否かを指し示します。

  • .ignoreCase

    "i"フラグが正規表現で使用されているか否かを指し示します。

  • .multiline

    "m"フラグが正規表現で使用されているか否かを指し示します。

  • .source

    スラッシュを除く、正規表現パターンのテキストを含む文字列を返します。

  • メソッド(prototype)

  • .exec()

    指定した文字列内でマッチ対象の検索を行い、結果の配列またはnullを返します。

  • .test()

    正規表現と指定した文字列がマッチするかを調べます。trueかfalseを返します。

  • .toString()

    正規表現を表す文字列を返します。

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

下記のスクリプトは、文字列インスタンスによって継承されたreplaceメソッドを使用して、 ファーストネーム、ラストネームのフォーマットを、ラストネーム、ファーストネームの順で出力します。 置換テキストでは、正規表現のカッコ内にマッチしたそれぞれに対応するものを指し示す$1$2をスクリプトで使用します。

var re = /(w+) (w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
print(newstr);  //"Smith, John"を表示

例: 複数行での正規表現の使用

var s = "Please yes
make my day!";
s.match(/yes.*day/);
// nullを返します。
s.match(/yes[^]*day/);
// 'yes
make my day'を返します。

例: 付箋(sticky)フラグ付きの正規表現の使用

下記は複数行入力の各行に対して、付箋(sticky)フラグを使用して正規表現にマッチさせる方法についての例になります。

var text = "First line
Second line";
var regex = /(S+) line
?/y; //y=付箋フラグ

var match = regex.exec(text);
print(match[1]);        // "First"を出力
print(regex.lastIndex); //  11を出力

var match2 = regex.exec(text);
print(match2[1]);       // "Second"を出力
print(regex.lastIndex); // "22"を出力

var match3 = regex.exec(text);
print(match3 === null); // "true"を出力

try { … } catch { … }を使用して、付箋(sticky)フラグがサポートされているか否かを実行時に検証することが出来ます。 これは、eval(…)表記、またはRegExp(regex-string, flags-string)のどちらかの文法が使用されるべきです。 (何故なら、/regex/flags表記はコンパイル時に処理されるため、catchブロックに行く前に例外がスローされてしまうためです。) 下記がその例になります。

var supports_sticky;
try { RegExp('','y'); supports_sticky = true; }
catch(e) { supports_sticky = false; }
alert(supports_sticky); // "true"をアラート

例: 正規表現とUnicode文字

前述した\wまたは\Wに言及すると、例えば'a'から'z'、'A'から'Z'、0から9と'_'のASCIIベースの文字にマッチします。 キリル文字やヘブライ語のような他の言語から文字をマッチするために、 "hhhh"がUnicode値の16進数である\uhhhhを使用します。 下記は、Unicode文字を単語毎に切り分ける例になります。

var text = "Образец text на русском языке";
var regex = /[Ѐ-ӿ]+/g;

var match = regex.exec(text);
print(match[0]);         // "Образец"出力
print(regex.lastIndex);  // "7"出力

var match2 = regex.exec(text);
print(match2[0]);        // "на"出力("text"は出力しない)
print(regex.lastIndex);  // "15"出力

// 以下、同じように続きます…。

このリンク先は、異なる言語のための完全なUnicodeブロック範囲を取得するための外部リソースになります。 Regexp-unicode-block

例: URLからサブドメイン名を抜き出す

var url = "http://xxx.domain.com";
print(/[^.]+/.exec(url)[0].substr(7)); // "xxx"出力

仕様

仕様 状態 コメント
ECMAScript 1st Edition. JavaScript 1.1実装 標準(standard) 初期定義
ECMAScript Language Specification 5.1th Edition (ECMA-262) 標準(standard)  
ECMAScript Language Specification 6th Edition (ECMA-262) 下書き(Draft)  

ブラウザの互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。