正規表現 (RegExp)
RegExpコンストラクタは、パターンにマッチさせるための正規表現オブジェクトを作成します。
正規表現が何のか学びたいのであれば、 JavaScriptガイドの正規表現チャプターを読んでみてください。
コンストラクタ
リテラルとコンストラクタの表記が可能です。
/pattern/flags;
new RegExp(pattern [, flags]);
引数 | 説明 |
---|---|
pattern |
正規表現のテキストを指定します。 |
flags |
指定されると、flagsは下記の値と組み合わせて使用することが可能です。 |
説明
RegExpオブジェクトの作成には、リテラル表記とコンストラクタの2つの方法が存在します。 文字列を指し示す際に、リテラル表記での文字列パラメータはクォーテーション記号を使用せず、 一方、コンストラクタ関数へのパラメータではクォーテーション記号を使用します。 そのため、下記の式はどちらも同じ正規表現を生成することになります。
/ab+c/i;
new RegExp("ab+c", "i");
式が評価される際に、リテラル表記は正規表現の編集を提供します。 正規表現が一定に保たれる場合に、リテラル表記を使用するようにしてください。 例えば、もしリテラル表記を使用してループ内で正規表現を構築する場合、 その正規表現は各反復処理で再構築されることはありません。
例えばnew RegExp("ab+c")
のような正規表現オブジェクトの構築であれば、
正規表現の実行時に編集をすることが出来ます。
あなたが知りうる正規表現パターンの変更や、あなたが知り得ないユーザー入力のようなパターンを用いる際に、
コンストラクタ関数を使用して下さい。
コンストラクタ関数を使用する際に、通常の文字列エスケープ(特殊文字列前の\
)のルールは必須となります。
例えば、下記の2つは同じ結果になります。
var re = /w+/;
var re = new RegExp("\w+");
正規表現での特殊文字
文字クラス | |
---|---|
文字 | 意味 |
. |
(ドット、少数点)
ドットの例として例えば、 |
\d |
基本的なラテンアルファベットの数字(digit)文字にマッチします。
例えば、 |
\D |
基本的なラテンアルファベットの数字文字では無い、任意の文字にマッチします。
例えば、 |
\w |
基本的なラテンアルファベットの任意の文字(word)にマッチします。アンダースコアも含まれます。
例えば、 |
\W |
基本的なラテンアルファベットでは無い任意の文字にマッチします。
例えば、 |
\s |
スペース、タブ、フォームフィード、ラインフィード、その他のUnicodeのスペースを含む、単一の空白文字にマッチします。
例えば、 |
\S |
空白以外の単一の文字列にマッチします。
例えば、 |
\t |
タブにマッチします。 |
\r |
キャリッジリターン(Carriage Return)の改行コードにマッチします。 |
\n |
ラインフィード(Line Feed、New Line)の改行コードにマッチします。 |
\v |
垂直タブにマッチします。 |
\f |
フォームフィードにマッチします。 |
[\b] |
バックスペースにマッチします。( |
\0 |
NUL(null)文字にマッチします。 この後に数値を続けてはいけません。 |
\cX |
XはAからZの文字です。 文字列内の制御文字と一致します。
例えば、 |
\xhh |
hhコード(2桁の16進数(hexadecimal))の文字にマッチします。 |
\uhhhh |
Unicode値hhhh(4桁の16進数)の文字にマッチします。 |
\ |
通常はリテラルとして扱われる次に来る文字を特別なものとし、リテラルとして解釈をしないという事を指定します。
例えば、 または、 通常は特別に扱われる次に来る文字を特別では無いものとし、リテラル文字として解釈するという事を指定します。
例えば、 |
文字セット | |
文字 | 意味 |
[xyz] |
文字セットです。
括弧内の文字のいずれか1つにマッチします。
ハイフン(
例えば、 |
[^xyz] |
文字セットを無効または補完します。
これは括弧内に無い何らかの文字にマッチします。
ハイフン(
例えば、 |
境界 | |
文字 | 意味 |
^ |
入力の始端にマッチします。
もし
例えば、 |
$ |
入力の末端にマッチします。
もし
例えば、 |
\b |
文字とスペースの間のような、単語の境界(幅がゼロであるもの)にマッチします。(
例えば、 |
\B |
2つの文字の間、2つのスペースの間のような単語の境界では無い部分(幅がゼロであるもの)にマッチします。
例えば、 |
グループと後方参照 | |
文字 | 意味 |
(x) |
xにマッチし、マッチしたものを記憶します。 これらはキャプチャリング括弧(capturing parentheses)と呼ばれます。
例えば、 グループのキャプチャはパフォーマンスを低下させます。 もし、マッチした文字列の再呼び出しの必要が無いのであれば、キャプチャリング括弧を使用しない方が良いでしょう(下記参照)。 |
\n |
nには正の整数を指定します。 正規表現内の左の括弧からカウントして、n番目の括弧の最後の文字列にマッチする後方参照です。
例えば、 |
(?:x) |
xにマッチしますが、それを記憶しません。 これは非キャプチャリング括弧(non-capturing parentheses)と呼ばれます。 マッチした文字列は、マッチ結果の配列要素[1]…[n]、 または予め定義したRegExpオブジェクトのプロパティ$1…$9として再呼び出しすることが出来ません。 |
数量 | |
文字 | 意味 |
* |
この記号の前にある文字、0個以上にマッチします。
例えば、 |
+ |
この記号の前にある文字1個以上にマッチします。
例えば、 |
*? +? |
上記の
例えば、 |
? |
この記号の前にある文字0個または1個にマッチします。
例えば、
もし、数量を表す
先読みアサーションでも使用され、この表の |
x(?=y) |
その後にyが続くxにのみマッチします。
例えば、 |
x(?!y) |
その後にyが続かないxのみにマッチします。
例えば、
|
x|y |
xまたはyのどちらかにマッチします。
例えば、 |
{n} |
nには正の整数を指定します。 この記号の前の文字の、正確なn回数の出現に対してマッチします。
例えば、 |
{n,} |
nは正の整数です。 この記号の前の文字に、少なくともn回数の出現に対してマッチします。
例えば |
{n,m} |
nとmは正の整数です。 この前の文字が少なくともn回最大、m回の出現に対してマッチします。
例えば、 |
プロパティとメソッド
-
プロパティ
-
.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 |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。