JavaScriptの正規表現で設定できるフラグの一覧
正規表現ではフラグ(またはオプション)を設定することで文字列がパターンにマッチする仕組みを変更することができます。ここでは JavaScript で設定可能なフラグの種類と、それぞれのフラグの使い方について解説します。
(Last modified: )
目次
正規表現オブジェクトへのフラグの設定方法
フラグは正規表現オブジェクトを作成するときに設定します。正規表現リテラルの場合は次のように記述します。
/パターン/フラグ
フラグにはひとつまたは複数のフラグを表す文字を指定します。
let regexp1 = /.*/i; let regexp2 = /.*/ig;
RegExp コンストラクタを使用する場合は次のように記述します。
new RegExp(パターン, フラグ)
フラグにはひとつまたは複数のフラグを表す文字を指定します。
let regexp1 = new RegExp(/.*/, 'i'); let regexp2 = new RegExp(/.*/, 'ig');
JavaScriptの正規表現で利用できるフラグの種類
次に JavaScript で用意されているフラグの種類と説明です。 6 種類のフラグが用意されています。
フラグ | フラグ名 | 説明 |
---|---|---|
g | Global | 置換などで通常はパターンに最初に一致した文字列だけを置換しますが、 g フラグが設定されていると一致するすべての文字列を置換します。 |
i | IgnoreCase | パターンで大文字と小文字を区別しなくなります。 /a/ の場合は /A/ にもマッチします。 |
m | Multiline | 複数行モード。メタ文字の ^ や $ が文字列の先頭と末尾だけでなく、各行の先頭と末尾にもマッチするようになります。 |
s | DotAll | メタ文字の . は改行文字にはマッチしませんが、 s フラグを設定するとマッチするようになります。 |
u | Unicode | 通常は \uhhhh が UTF-16 のコードユニットを表しますが、 u フラグを設定すると \u{hhhh} や \u{hhhhh} を Unicode コードポイントとして使用できます。 |
y | Sticky | lastIndex プロパティが示す位置より後ではなく、 lastIndex プロパティの位置からのみ一致するかどうかを判定する。 |
それではそれぞれのフラグについてより詳しく見ていきます。
gフラグ(Global)
g フラグを設定すると RegExp オブジェクトの test メソッドや exec メソッド、 String オブジェクトの match メソッド replace メソッドの挙動が変更されます。具体的にはそれぞれのメソッドの使い方を見て下さい。
例えば文字列の置換を行う replace メソッドの場合だと、 g フラグが設定されていない場合は対象の文字列の中で最初にマッチした文字列だけを置換しますが、 g フラグが設定されている場合には対象の文字列の中でマッチするすべての文字列が置換されます。
簡単なサンプルで試してみます。 g フラグを設定していない場合は replace メソッドを実行すると最初にマッチした文字列だけが置換されます。
let regexp = /(Red|RED)/;
let str = 'Border Color is Red, Line Color is RED';
let newstr = str.replace(regexp, 'red');
console.log(newstr);
>> Border Color is red, Line Color is RED
続いて g フラグを設定した場合です。 replace メソッドを実行すると対象の文字列の中でマッチしたすべての文字列が置換されます。
let regexp = /(Red|RED)/g;
let str = 'Border Color is Red, Line Color is RED';
let newstr = str.replace(regexp, 'red');
console.log(newstr);
>> Border Color is red, Line Color is red
iフラグ(IgnoreCase)
i フラグを設定するとパターンの中で記述したアルファベットの大文字と小文字を区別しなくなります。
例えば次の 3 つのパターンは同じ文字列にマッチします。
/[a-zA-Z]/ /[a-z]/i /[A-Z]/i
簡単なサンプルで試してみます。 i フラグを設定しているので [a-z] は小文字の a から z だけでなく大文字の A から Z にもマッチします。
let regexp = /<span>[a-z]*<\/span>/i;
let str = 'I\'m going to <span>Kyoto</span> today';
let result = str.match(regexp);
console.log(result[0]);
>> <span>Kyoto</span>
mフラグ(Multiline)
メタ文字の ^ や $ は文字列の先頭と末尾の位置にマッチしますが、 m フラグを設定すると ^ や $ は文字列の先頭と末尾以外に、行の先頭と末尾にもマッチします。
簡単なサンプルで試してみます。 m フラグを設定していない場合は $ は文字列の末尾にだけマッチします。
let regexp = /\w{4}Script\.$/;
let str = `Today we're studying JavaScript.
Tomorrow will study the TypeScript.`;
let result = regexp.exec(str);
console.log(result[0]);
>> TypeScript.
続いて m フラグを設定した場合です。 m フラグが設定されている場合は $ は行末にもマッチします。
let regexp = /\w{4}Script\.$/m;
let str = `Today we're studying JavaScript.
Tomorrow will study the TypeScript.`;
let result = regexp.exec(str);
console.log(result[0]);
>> JavaScript.
sフラグ(DotAll)
任意の一文字にマッチするドット(.)は改行にはマッチしませんが、 s フラグを設定するとドット(.)は改行にもマッチします。
簡単なサンプルで試してみます。 s フラグを設定していない場合はドット(.)は改行にマッチしないため、文字列はパターンにマッチしません。
let regexp = /<span>.*<\/span>/; let str = `彼の住所は<span>東京都中央区 日本橋</span>です。`; console.log(regexp.test(str)); >> false
続いて s フラグを設定した場合です。 s フラグが設定されているとドット(.)は改行にもマッチするようになります。
let regexp = /<span>.*<\/span>/s;
let str = `彼の住所は<span>東京都中央区
日本橋</span>です。`;
let result = regexp.exec(str);
console.log(result[0]);
>> <span>東京都中央区
>> 日本橋</span>
uフラグ(Unicode)
u フラグを設定すると、 Unicode コードポイントを使って文字を指定することができます。サロゲートペアを使用する文字であっても 1 つのコードポイントでマッチさせることができます。(サロゲートペアについては「JavaScriptにおけるサロゲートペアとは」を参照されてください)。
簡単なサンプルで試してみます。 u フラグを設定していない場合は、 \uhhhh の形式でパターンの中に文字を指定します。 hhhh には UTF-16 コードユニットで指定するため、サロゲートペアで表される文字については 2 つのコードユニットを記述します。
let regexp = /\ud83d\ude38/;
let str = 'サロゲートペアで表される文字には●があります';
let result = regexp.exec(str);
console.log(result[0]);
>> ●
※ ● のところには次の絵文字が入ります。
続いて u フラグを設定した場合です。 \u{hhhh} または \u{hhhhh} の形式でパターンの中に文字を指定することができ、 hhhh または hhhhh は Unicode コードポイントのため、 UTF-16 ではサロゲートペアで表される文字であっても 1 つのコードポイントで記述できます。
let regexp = /\u{1f638}/u;
let str = 'サロゲートペアで表される文字には●があります';
let result = regexp.exec(str);
console.log(result[0]);
>> ●
※ ● のところには次の絵文字が入ります。
yフラグ(Sticky)
正規表現では通常文字列の先頭からマッチするかどうかを調べながら右へ右へと移動していきますが、 y フラグを設定すると RegExp オブジェクトの lastIndex プロパティが示す位置からのみマッチするかどうかを調べます。
lastIndex プロパティはデフォルトで 0 ですが、 g フラグが設定された状態で RegExp オブジェクトの test メソッドや exec メソッドを実行してマッチした場合、マッチした文字列の最後の文字の次の文字の位置が lastIndex プロパティに設定されます。また任意の値を直接 lastIndex プロパティに設定することもできます。
簡単なサンプルで試してみます。 y フラグを設定していない場合は、対象の文字列の先頭から順にパターンがマッチするかどうかを試していきます。
let regexp = /中央区/; let str = '東京都中央区日本橋'; console.log(regexp.test(str)); >> true
y フラグを設定している場合は、現在の lastIndex の位置からのみパターンがマッチするかどうかを調べます。
let regexp = /中央区/y; let str = '東京都中央区日本橋'; console.log(regexp.lastIndex); >> 0 console.log(regexp.test(str)); >> false regexp.lastIndex = 3; console.log(regexp.test(str)); >> true
-- --
JavaScript で設定可能なフラグの種類と、それぞれのフラグの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。