正規表現で使えるフラグ
正規表現では、大文字と小文字を区別せずに一致と判定させたりできます。
本ページでは、正規表現で使えるフラグについて説明します。
フラグとは
正規表現では、一致と判定する条件を指定できます。例えば、大文字と小文字を区別せずに一致と判定させたりできます。これは、フラグを使って実現します。
フラグは、正規表現リテラルで記述する場合は以下のように使います。
let x = /abc/フラグ;
例えば、/abc/gと記述して使います。gがフラグです。
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フラグ利用例は、以下のとおりです。
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フラグ利用例は、以下のとおりです。
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フラグ利用例は、以下のとおりです。
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フラグ利用例は、以下のとおりです。
let x = /a./g; let y = [..."abad".matchAll(x)];
上記で、y[0][0]は"ab"、y[1][0]は"ad"になります。x.lastIndexは0になります。
matchALLはgフラグが必須で、複数の一致した文字列すべてを配列に代入します。
matchと違うのは、多次元配列になっている点です。以下があったとします。
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フラグ利用例は、以下のとおりです。
let x = /a./g; let y = "abad".replace(x,"12");
上記で、"ab"も"ad"も"12"に置換されて、yは"1212"になります。
もしgフラグを使わない場合、"ab"だけが置換されてyは"12ad"になります。
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に置換)。
メソッド | 結果 | 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フラグの利用例は、以下のとおりです。
let x = /ab/i; let y = x.test("ABCD");
上記で、yはtrueになります。
もしiフラグを使わないと、大文字と小文字を区別するため、falseになります。
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フラグの利用例は、以下のとおりです。
let x = /b./s; let y = x.test("ab\ncd");
ドット(.)はsフラグを使わないと改行と一致しませんが、上記のようにsフラグを使うことで一致するようになります。このため、"ab\ncd"でbの後の改行(\n)が一致して、yはtrueになります。
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フラグの利用例は、以下のとおりです。
let x = /ab/y; let y = x.test("cdabcd");
上記の検索対象"cdabcd"は"ab"を含んでいますが、yはfalseになります。"ab"から開始されていないためです。
今度は、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になります。
最初のページ「正規表現の使い方」