レッスンに戻る

引用符で囲まれた文字列を見つける

ダブルクォート "..." 内の文字列を見つける正規表現を作成してください。

重要なことは、文字列は JavaScript の文字列がするのと同じ方法でエスケープをサポートする必要があるということです。例えば、引用符は \" として挿入でき、改行は \n 、スラッシュ自身は \\ です。

let str = "Just like \"here\".";

エスケープされた引用符 \" は文字列を終了しないことが重要です。

そのため、途中でエスケープされた引用符は無視して、ある引用符から他の引用符に目を向ける必要があります。

これがこのタスクの肝心な部分です。そうでなければ答えは明らかです。

マッチさせる文字列の例です:

.. "test me" ..
.. "Say \"Hello\"!" ... (内側にエスケープされた引用符がある)
.. "\\" ..  (内側にダブルスラッシュがある)
.. "\\ \"" ..  (内側にダブルスラッシュとエスケープされた引用符がある)

JavaScript では、次のように、そのまま文字列として渡すにはスラッシュを2重にする必要があります:

let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';

// メモリ内部の文字列
alert(str); //  .. "test me" .. "Say \"Hello\"!" .. "\\ \"" ..

解答: /"(\\.|[^"\\])*"/g.

1つずつ見ていきましょう:

  • まず、開始の引用符 " を探します。
  • 次にバックスラッシュ \\ がある場合(技術的に、パターンの中ではスラッシュは特別な文字であるため2重にしなければなりません。そのため、実際にはこれは1つのスラッシュを意味します)、その後は任意の文字で問題ありません(ドット)。
  • そうでない場合、引用符(これは文字列の終わりを意味します)とバックスラッシュ(単独のバックスラッシュを防ぐため。バックスラッシュはその後の別のシンボルとともにのみ使用されます)を除く任意の文字を取ります: [^"\\]
  • …終了の引用符まで続きます。

動作:

let reg = /"(\\.|[^"\\])*"/g;
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';

alert( str.match(reg) ); // "test me","Say \"Hello\"!","\\ \""