VSCode、JavaScriptの正規表現でMarkdownの数式を置換するときにハマったところ

はじめに

最近JavaScriptで文書の置換ソフトを作ろうとしているんですが、VSCodeでまず正規表現を試そうとしてうまくいかなかったので、その対処法を備忘録的に紹介します。

JavaScriptにて

直感的な方から先に紹介します。例えば、以下のようなLaTeXの数式が混在しているMarkdownがあるとします。

ああああああ$ABC$テストです。
$$
x = 2y
$$$a$意味もない数式$x$を使って$$
y = ax$$と表せる

これを、JavaScriptで行の数式("$$~~$$")だけ置換しようとすると以下のようなコードが書けます。

`ああああああ$ABC$テストです。
$$
x = 2y
$$$a$意味もない数式$x$を使って$$
y = ax$$と表せる`.replace(/\$\$([\s\S]+?)\$\$/g, "{$1}")

// ->
// "ああああああ$ABC$テストです。
// {
// x = 2y
// }$a$意味もない数式$x$を使って{
// y = ax}と表せる"

普通の正規表現で置換することができました。

VSCodeにて

正規表現\$\$([\s\S]+?)\$\$をそのまま使って検索をすると、以下のように間違った部分がハイライトされます。

f:id:yuppi5:20190929223848p:plain
間違ったハイライト
うーん、これは良くないですね。

そこで、正規表現に改行を明示的に含めることにします。\$\$([\s\S\n]+?)\$\$とします。

f:id:yuppi5:20190929224106p:plain
正常な検索
すると正常にハイライトされました。この状態であれば思い通りに置換することができます。
f:id:yuppi5:20190929224145p:plain
祝!正常に置換されました!

最後に

VSCodeのドキュメントも読んでいないのでもしかしたらこれが仕様かもしれません。