sフラグについて
ES2018から正規表現の新たなフラグとして追加されたsフラグです。
「.」はほぼ全ての文字にマッチする記号として使われていましたが、改行コードにはマッチしていませんでした。sフラグを使うと改行にマッチさせることができます。「.」が改行にもマッチするようになることからドットオール(Dot All)と呼ばれています。
マッチするようになる改行とは
改行と一言で書きましたが、以下のものがドットでマッチするようになります。
- U+000A ラインフィード (LINE FEED / LF) (
\n
) - U+000D キャリッジリターン (CARRIAGE RETURN / CR) (
\r
) - U+2028 ラインセパレーター (LINE SEPARATOR)
- U+2029 パラグラフセパレーター (PARAGRAPH SEPARATOR)
sフラグのないドット ( ドットでは改行を認識しない)
まずsフラグのない、ドットの使われ方の確認です。ドットはほぼすべての文字にマッチしますが改行はマッチしません。
例 ドットだけだと改行コードを認識しない
let s = `こんにちは
さようなら`;
/こんにちは.さようなら/.test(s);
// – false
※Javascriptでの改行の書き方はこちら
sフラグが使える前の改行の認識のさせ方
sフラグの使い方の前にまず、参考までにまずES2018以前のsフラグがなかったときの書き方です。
ドット以外で改行を認識させる
ドットを使用しても改行は認識されないため、改行を認識させるために[\s\S] または[^]を使用していました。
[^]で改行を認識
let s = `こんにちは
さようなら`;
/こんにちは[^]さようなら/.test(s);
// – true
[\s\S]で改行を認識
let s = `こんにちは
さようなら`;
/こんにちは[\s\S]さようなら/.test(s);
// true
sフラグ(ドットオール)で改行を含む文字列を認識させる
ようやく sフラグ(ドットオール)の使い方です。
先ほど改行を認識しなかったドットにsフラグをつけてあげることで、ドットオールモードになりドットは改行も認識するようになります。
let s = `こんにちは
さようなら`;
/こんにちは.さようなら/s.test(s);
// true
sフラグで()内の文字を取得してみる
改行を含むカッコ内の文字列を取得しようとした場合、sフラグが便利です。
// 適当に作った改行を含む文字をstrに代入
let str = `例えば(このカッコ内の
文字を取得)こんな文`;
// カッコ内の文字を取得
let result = str.match( /(.+)/s );
//コンソールにresultの中身を表示
console.log(result);
※ + (半角プラス) は、直前の1文字の1回以上の繰り返しを表現しています
余談 ES2018以前の書き方
// 適当に作った改行を含む文字をstrに代入
let str = `例えば(このカッコ内の
文字を取得)こんな文`;
// カッコ内の文字を取得
let result = str.match( /([^]+)/ );
//コンソールにresultの中身を表示
console.log(result);
おわり
はじめはフラグもわからないところから調べ出したので、sフラグを理解するのにかなり時間をようしました。
いろいろ調べていたら、なぜsフラグはsなのかと言う話題があり、Pythonなどが先にsを使用していたからということでした。
従来の書き方に比べてものすごい書きやすくなったのかよくわかりませんが、覚えておいて困ることはないですよね。
参考サイト:https://github.com/tc39/proposal-regexp-dotall-flag
参考サイト: 正規表現にdotAllフラグが追加された – JS.next – はてなブログ