正規表現で使えるフラグ

正規表現では、大文字と小文字を区別せずに一致と判定させたりできます。

本ページでは、正規表現で使えるフラグについて説明します。

フラグとは

正規表現では、一致と判定する条件を指定できます。例えば、大文字と小文字を区別せずに一致と判定させたりできます。これは、フラグを使って実現します。

フラグは、正規表現リテラルで記述する場合は以下のように使います。

【フラグの使い方(正規表現リテラルの場合)】
let x = /abc/フラグ;

例えば、/abc/gと記述して使います。gがフラグです。

RegExpのコンストラクタ関数を使う場合は、以下のように使います。

【フラグの使い方(RegExpのコンストラクタ関数を使う場合)】
let x = new RegExp("abc","フラグ");

例えば、RegExp("abc","g")と記述して使います。

以下は、フラグの種類です。

【正規表現で使えるフラグ】
フラグ 説明
g 1度マッチした後も検索します。グローバルサーチと呼ばれます。
i 大文字と小文字を区別しません。
m 複数行を対象とする時、1行単位に判定します。
s ドット(.)は任意の一文字に一致しますが、改行も一致するようになります。
u Unicode(ユニコード)が正確に扱えます。
y 指定した場所から一致が始まるかを判定します(Sticky検索)。

giなどと、複数のフラグを利用することもできます。

次からは、各フラグの利用例を示します。

gフラグ

gフラグは、test、exec、match、matchAll、replaceメソッドによって動作が異なります。次からは、各メソッドでのgフラグ利用例を示します。

testメソッド

testメソッドは、パターンが一致すればtrue、一致しなければfalseを返します。

testメソッドでのgフラグ利用例は、以下のとおりです。

【testメソッドでのgフラグ利用例】
let x = /ab/g;
let y = x.test("abcd");

上記で、yはtrueになります。gフラグがない時と結果は変わりませんが、gフラグを使うとlastIndexプロパティに一致を判定するための次の位置が入ります。上記では、"abcd"の内"ab"が一致したため、次の位置としてx.lastIndexが2になります。

このため、let z = x.test("abcd");を追加すると、"cd"の文字列が/ab/と一致しないので、zはfalseになります。gフラグを使わない場合、x.lastIndexは0なので最初から検索して、zはtrueになります。

つまり、gフラグを使うと検索結果の位置を覚えておいて、そこから検索することができるということです。

execメソッド

execメソッドは、パターンが一致すればその文字列を配列で、一致しなければnullを返します。

execメソッドでのgフラグ利用例は、以下のとおりです。

【execメソッドでのgフラグ利用例】
let x = /a./g;
let y = x.exec("abad");

/a./は、aと続く任意の1文字が一致となります。

このため、検索対象の"abad"の内"ab"が一致となり、y[0]は"ab"になります。gフラグがない時と結果は変わりませんが、testメソッドと同じでgフラグを使うとlastIndexプロパティに一致を判定するための次の位置が入ります。

このため、let z = x.exec("abad");を追加すると、"ad"の文字列が/a./と一致するかが判定されて、z[0]は"ad"になります。

matchメソッド

matchメソッドは、パターンが一致すればその文字列を配列で、一致しなければnullを返します。

matchメソッドでのgフラグ利用例は、以下のとおりです。

【matchメソッドでのgフラグ利用例】
let x = /a./g;
let y = "abad".match(x);

上記で、y[0]は"ab"、y[1]は"ad"になります。つまり、gフラグがなければy[0]が"ab"になるだけですが、gフラグを使うことで複数の一致した文字列すべて(今回は"ab"と"ad")を配列に代入します。

最後まで検索するため、x.lastIndexは0になります。このため、let z = "abad".match(x);を追加すると最初から検索されて、z[0]は"ab"、z[1]は"ad"になります(y[0]とy[1]の値と同じになります)。

matchAllメソッド

matchAllメソッドは、パターンが一致すればその文字列を配列で、一致しなければnullを返します。複数一致すれば、すべて対象になります。

matchAllメソッドでのgフラグ利用例は、以下のとおりです。

【matchAllメソッドでのgフラグ利用例】
let x = /a./g;
let y = [..."abad".matchAll(x)];

上記で、y[0][0]は"ab"、y[1][0]は"ad"になります。x.lastIndexは0になります。

matchALLはgフラグが必須で、複数の一致した文字列すべてを配列に代入します。

matchと違うのは、多次元配列になっている点です。以下があったとします。

【matchAllメソッドでの()とgフラグ利用例】
let x = /a(.)/g;
let y = [..."abad".matchAll(x)];

赤字部分を変えています。上記は、以下になります。

  • y[0] === ["ab", "b"]
  • y[1] === ["ad", "d"]

y[0][0]が"ab"で、y[1][0]が"ad"の点は、先の例と同じです。()内は記憶されて、y[0][1]とy[1][1]に代入されます。ドットがすべての1文字に一致するため、(.)によってaの後に続く1文字が記憶されて、y[0][1]が"b"、y[1][1]が"d"となります。

replaceメソッド

replaceメソッドは、パターンに一致した文字列を置換します。一致しなければ置換しません。

replaceメソッドでのgフラグ利用例は、以下のとおりです。

【replaceメソッドでのgフラグ利用例】
let x = /a./g;
let y = "abad".replace(x,"12");

上記で、"ab"も"ad"も"12"に置換されて、yは"1212"になります。

もしgフラグを使わない場合、"ab"だけが置換されてyは"12ad"になります。

lastIndexプロパティの補足

以下のように、lastIndexプロパティの値を指定することもできます。

【lastIndexプロパティで開始位置を指定する例】
let x = /ab/g;
x.lastIndex = 2;
let y = x.test("abcd");

赤字の指定により、"abcd"の内"cd"だけが検索対象になります。"ab"を含まないため、yはfalseになります。

この時、gフラグを利用していないと開始位置は0のままとなり、yはtrueになります。

gフラグのまとめ

gフラグを使った時の各メソッドでの動きの違いをまとめます。

検索パターンが/a./g、検索対象が"abcdad"だった場合、それぞれのメソッドでの結果とlastIndexは以下になります(replaceはa.と一致すると12に置換)。

【gフラグを使った時の各メソッドでの結果】
メソッド 結果 lastIndex
test true 2
exec ["ab"] 2
match ["ab","ad"] 0
matchAll [["ab"],["ad"]] 0
replace 12cd12 0

[]は、配列を示します。matchAllでは多次元配列を示しています。

testやexecメソッドは、一度一致すると終わりですが、もう一度検索した時はlastIndexによって次の位置から開始することができます。

match、matchAllメソッドは、すべての検索結果を取得できて、replaceでは一致するすべてを置換できることがわかると思います。

iフラグ

iフラグの利用例は、以下のとおりです。

【iフラグの利用例】
let x = /ab/i;
let y = x.test("ABCD");

上記で、yはtrueになります。

もしiフラグを使わないと、大文字と小文字を区別するため、falseになります。

mフラグ

mフラグの利用例は、以下のとおりです。

【mフラグの利用例】
let x = /^c/m;
let y = x.test("ab\ncd");

上記で、yはtrueになります。^は、続く文字が先頭の時に(この例ではcであれば)一致と判定します。\nは、改行を示します。

mフラグがないと、"ab\ncd"の先頭文字は"a"なのでfalseになります。mフラグがあると行単位に判定するため、改行(\n)後最初の"c"も先頭文字になるため、trueになるという訳です。

sフラグ

sフラグの利用例は、以下のとおりです。

【sフラグの利用例】
let x = /b./s;
let y = x.test("ab\ncd");

ドット(.)はsフラグを使わないと改行と一致しませんが、上記のようにsフラグを使うことで一致するようになります。このため、"ab\ncd"でbの後の改行(\n)が一致して、yはtrueになります。

uフラグ

uフラグの利用例は、以下のとおりです。

【uフラグの利用例】
let x = /𧘕{2}/u;
let y = x.test("𧘕𧘕");

通常使う文字(英数字、ひらがな、常用漢字など)のUnicodeは1〜3バイトで表現されるため、1〜3バイトを基本として判定します。絵文字やあまり使われない漢字などは、4バイト使います。上記の𧘕も4バイトです。

このため、上記でuフラグがない場合、yはfalseになります。{2}は直前の文字が2つ続く時に一致と判定しますが、4バイトの内後の2バイトが続くかで判定されるためです。

uフラグを付けると4バイトで判定されるため、上記でyはtrueになります。

なお、正規表現は/\u3042/などと、文字コードを使っても記述できます。u3042は、"あ"が該当します。4バイト使う文字では、/\u{27615}/uなどと記述する必要があります。この時、uフラグは必須です。

yフラグ

yフラグの利用例は、以下のとおりです。

【yフラグの利用例】
let x = /ab/y;
let y = x.test("cdabcd");

上記の検索対象"cdabcd"は"ab"を含んでいますが、yはfalseになります。"ab"から開始されていないためです。

今度は、lastIndexプロパティで開始位置を指定する例です。

【yフラグの利用例(lastIndexで位置指定)】
let x = /ab/y;
x.lastIndex = 2;
let y = x.test("abcdab");

上記は、lastIndexプロパティの位置からのみ判定するため、yはfalseになります。"abcdab"の内"cdab"が検索対象ですが、最初に"ab"から始まっていないとfalseになるためです。

文字列が"cdabcd"であれば(x.test("cdabcd")であれば)、検索対象は"abcd"で"ab"から始まるためtrueになります。

もし、yフラグを使わない場合、x.lastIndex = 2を指定しても最初の位置から判定します。このため、x.test("abcdab")はtrueになります。

最初のページ正規表現の使い方