RegExp

概要

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

構文

var regex = new RegExp("pattern" [, "flags"]);
var literal = /pattern/flags;

引数

pattern
正規表現のテキスト。
flags
フラグは、次の値を任意の組み合わせで指定できます。:
g
グローバルなマッチ
i
大文字・小文字の無視
m
複数行に渡るマッチ
y
先頭固定 (sticky)。対象文字列中の正規表現の lastIndex プロパティによって示された位置からのみマッチするようになります(それより後の位置からのマッチは試みません)。このフラグは、 特殊文字 "^" が持つ開始位置でのみマッチする性質を、lastIndex プロパティの値を変更することにより文字列中の任意の位置で効果的に用いることを可能にします。

説明

コンストラクタ関数を使うとき、通常の文字列のエスケープルール(文字列の中に \ 付きの特別な文字列が含まれているときにはその文字をエスケープするルール)に従う必要があります。例えば、以下は等価です。:

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

リテラルフォーマットでの引数はクォーテーションで囲みませんが、コンストラクタ関数での引数はクォーテーションで囲むことに注意してください。ですから、以下の表現は同じ正規表現を生成していることになります。:

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

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

文字 意味
\

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

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

あるいは、

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

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

^

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

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

$

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

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

* 直前の文字の 0 回以上の繰り返しにマッチします。例えば、/bo*/ は "A ghost booooed" の 'boooo' や "A bird warbled" の 'b' にはマッチしますが、"A goat grunted" のどんな文字にもマッチしません。
+ 直前の文字の 1 回以上の繰り返しにマッチします。{1,} と等価です。例えば、/a+/ は "candy" の 'a' や、"caaaaaaandy" のすべての a にマッチします。
?

直前の文字の 0 回か 1 回の繰り返しにマッチします。

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

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

先読み表現でも使えますが、それについてはこの表の (?=)(?!) 、 及び (?:) で説明します。

.

(この文字は小数点です) 改行文字(\n、\r、 \u2028、あるいは、\u2029)を除いたあらゆる 1 文字にマッチします( [\s\S] という正規表現を使えば、改行文字を含めたあらゆる文字にマッチさせることができます)。

例えば、/.n/ は "nay, an apple is on the tree" の 'an' と 'on' にはマッチしますが、'nay' にはマッチしません。

(x)

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

例えば、/(foo)/ は、 "foo bar." の 'foo' にマッチし、それを記憶します。 マッチした部分文字列は、マッチ結果の配列の要素 [1], ..., [ n ] か、あらかじめ定義された RegExp オブジェクトのプロパティ $1, ..., $9 から参照することができます。

(?:x) x にマッチしますが、マッチしたものを記憶しません。これはキャプチャしない括弧 (non-capturing parentheses)と呼ばれます。マッチした部分文字列は、マッチ結果の配列の要素 [1], ..., [n] と、あらかじめ定義された RegExp オブジェクトのプロパティ $1, ..., $9 からは参照することができません。
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 にはマッチしません。

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}

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

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

[ xyz ]

文字の集合。 囲まれた文字のどんな 1 文字にもマッチします。 ハイフンを用いて文字の範囲を指定することができます。

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

[^ xyz ]

文字の集合の否定または補集合。つまり、括弧で囲まれていないどんな文字にもマッチします。 ハイフンを用いて文字の範囲を指定することができます。

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

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

スペースなどで区切られた単語 (word boundary)にマッチします。( [\b] と混同しないでください。)

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

\B

単語の区切りではない文字にマッチします。

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

\cX

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

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

\d

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

注意:Firefox 2 とそれ以前では、あらゆるアルファベット中における数字にマッチします。(バグ 378738【訳注: ここでのアルファベットの意味は、ラテン文字に限らない、表音文字の総称です。つまり、例えば、1などの全角数字にもマッチするということです。】

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

\D

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

注意:Firefox 2 とそれ以前では、全てのアルファベットにおける数字以外の文字にマッチします。(バグ 378738【訳注: ここでのアルファベットの意味は、ラテン文字に限らない表音文字の総称です。つまり、例えば、1などの全角数字にはマッチしないということです。】

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

\f 改ページ(FF) (form-feed) にマッチします。
\n 改行(LF) (linefeed) にマッチします【訳注: n は newline から】
\r 行頭復帰(CR) (carriage return) にマッチします。
\s

スペース (space)、タブ、改ページ、改行、その他のユニコードでのスペースを含む、単一の空白文字にマッチします[equivalent_s]

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

\S

空白以外の単一の文字にマッチします[equivalent_S]

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

\t タブ (tab) にマッチします。
\v 垂直タブ (a vertical tab) にマッチします。
\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%" の '%' にマッチします。

\n

n には正の整数が入ります。その正規表現の (左の括弧から数えて)n 番目の括弧に囲まれた部分にマッチする最後の部分文字列への後方参照 (back reference)です。

例えば、/apple(,)\sorange\1/ は、"apple, orange, cherry, peach." の 'apple, orange,' にマッチします。 より相応しい例がこの表よりも下の項目にあります。

\0 NUL 文字【訳注: NUL は null の略であり、0 を意味するドイツ語】にマッチします。 この後ろに他の数字を続けてはいけません。
\xhh hh(2 桁の 16 進表現 (two hexadecimal digits))で表される文字にマッチします【訳注: x は hexadecimal から】
\uhhhh hhhh( 4 桁の 16 進表現)で表される Unicode 値の文字にマッチします【訳注: u は Unicode の u から。つまり、これは Unicode エスケープシーケンスです】

リテラル表記は、その表現が評価されたときに、正規表現を生成して提供します。リテラル表記を使用するのは、その正規表現が常に同じであり続けるだろうと考えられるときにしてください。例えば、もし正規表現をループで使用するためにリテラル表記を使うとき、その正規表現は繰り返し処理毎に再生成されないでしょう。

正規表現オブジェクトのコンストラクタ、例えば、new RegExp("ab+c") は、正規表現のランタイムを提供します。コンストラクタ関数を使用するのは、正規表現のパターンが変更される可能性があるとき、もしくは、パターンがわからず、ユーザの入力のような他のソースから正規表現を作成するときにしてください。

  1. ^ これは以下の表現と同等です。
    [\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]
    
  2. ^ これは以下の表現と同等です。
    [^\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]
    

プロパティ

RegExp インスタンスから継承されているプロパティについては、RegExp インスタンスのプロパティを参照してください。
prototype
全てのオブジェクトへプロパティを追加することを許可します。
Function.prototype から継承されるプロパティ

メソッド

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

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

Function.prototype から継承されるメソッド

RegExp インスタンス

Mozilla は 独自の JavaScript 拡張を提供しており、RegExp インスタンスをまるで文字列引数を取る関数であるかのように呼び出すことができます。 exec() を参照してください。

プロパティ

非推奨の 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");
print(newstr);

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

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

この例は、複数行の入力の個々の行にマッチさせるために正規表現で sticky フラグを用いる方法をデモしています。

var text = "First line\nsecond line";
var regex = /(\S+) line\n?/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); // alerts "false" in Firefox 2, "true" in Firefox 3

例: 正規表現と 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);
print(match[1]);  // prints "Образец"
print(regex.lastIndex);  // prints "7"

var match2 = regex.exec(text);
print(match2[1]);  // prints "на" [did not print "text"]
print(regex.lastIndex);  // prints "15"

// and so on

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

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
基本サポート ? (有) ? ? ?
機能 Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
基本サポート ? (有) ? ? ?

関連情報

Document Tags and Contributors

Contributors to this page: Drry, Potappo, ethertank, cu39
最終更新者: cu39,