ES 2018新特徴その:正規表現dotAllモード


ES 2018新機能
  • 非同期反復器
  • 正規表現逆(lookbehind)断言
  • 正規表現Unicodeエスケープ
  • 非エスケープシーケンスのテンプレート文字列
  • 正規表現s/dotAllモード(本明細書)
  • 正規表現名前付きキャプチャグループ
  • オブジェクト展開演算子
  • Promise.prototype.finally

  • 「正規表現のs(dotAll)flag」提案proposal-regexp-dotall-flagはMathias Bynensが担当し、現在はstage 4に入り、ES 9(ES 2018)の一部となる.
    1.概要
    JavaScript正規表現では、.を使用して任意の文字を一致させます.ただし、2つの例外があります.
    1.1マルチバイトemoji文字
    let regex = /^.$/;
    regex.test('?');   // false
    uフラグを設定することで解決できます.uの意味はunicodeです.
    let regex = /^.$/u;
    regex.test('?');   // true

    1.2ライン終端(line terminator characters)
    行の終端には次のものがあります.
  • U+000 A LINE FEED(LF)-改行
  • U+000 D CARRIAGE RETURN(CR)(
    )-リターン
  • U+2028 LINE SEPARATOR-行区切り記号
  • U+2029 PARAPH SEPARATOR-セグメントセパレータ
  • 他にも、行の先頭に立つ文字があります.
  • U+000B VERTICAL TAB ( \r )
  • U+000C FORM FEED ( \v )
  • U+0085 NEXT LINE

  • 現在のJavaScript正規表現の\fは、その一部を一致させることができます.
    let regex = /./;
    
    regex.test('
    '); // false regex.test('\r'); // false regex.test('\u{2028}'); // false regex.test('\u{2029}'); // false regex.test('\v'); // true regex.test('\f'); // true regex.test('\u{0085}'); // true

    正規表現では、文字列の先頭と文字列の末尾を表すメタ文字は.および^であるため、$を用いて一致する.
    /foo.bar/.test('foo
    bar'); // false /foo[^]bar/.test('foo
    bar'); // true

    または、^を使用して空白文字を一致させます.
    /foo.bar/.test('foo
    bar'); // false /foo[\s]bar/.test('foo
    bar'); // true

    2.s/dotAllフラグを追加
    最新のECMAScript仕様では、JavaScriptの正規表現にdotAllを表す新しいフラグ\sが追加されました.sが任意の文字に一致するようにします.
    /foo.bar/s.test('foo
    bar'); // true

    High-level API
    const re = /foo.bar/s;  //      const re = new RegExp('foo.bar', 's');
    re.test('foo
    bar'); // true re.dotAll; // true re.flags; // "s"

    3.命名の由来
    dotAll機能を実現するためである以上、なぜ.またはdと命名しないのか.他の言語の正規表現実装では、aフラグが使用されているからです.
  • Java使用s
  • C#およびVB使用Pattern.DOTALL
  • PythonはRegexOptions.Singlelinere.DOTALL
  • を同時にサポートする.
    正規表現にflagを使用する言語、例えばPerl、PHPもre.Sをフラグとして使用する.sの意味はsinglelineとdotAllです.
    singleline(単行)はmultiline(複数行)に対応する.sフラグは、複数行入力文字列が複数行とみなされるべきであることを指定するために使用される.mフラグが使用される場合、mおよび^が一致する開始または終了は、文字列全体の開始または終了ではなく、文字列の各行である.
    /^java/.test('just
    java
    '); // false /^java/m.test('just
    java
    '); // true
  • $フラグは、mおよび^
  • にのみ影響する.
  • $フラグはs
  • にのみ影響する.
    現在JavaScriptの正則表現におけるすべての修飾子の意味:
  • g → global
  • i → ignoreCase
  • m → multiline
  • y → sticky
  • u → unicode
  • s → dotAll

  • 4.実現
  • V8 - Chrome 62
  • JavaScriptCore - Safari Technology Preview 39a
  • XS, shipping in Moddable as of the January 17, 2018 update
  • regexpu (transpiler) with the . option enabled
  • online demo
  • Babel plugin

  • Compat-transpiler of RegExp Tree
  • Babel plugin