niku_ypp
@niku_ypp

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JSのコードから正規表現で式を含んだテンプレート文字列を抜き出す方法

テンプレート文字列が含まれるJSのソースコードで、VSCode等の検索機能を用いて正規表現を使ってテンプレート文字にマッチさせたいです。
今試しているのが

/`[\s\S]*?(?<!(?<!\\)\\)`/

なのですが、この中に${}の式があり、その式の中にテンプレート文字列がある場合、正しくマッチしてくれません。

例えば、

`string1 string2`

なら`string1 string2`でマッチしますが、

`string1 ${`string2`} string3`

だと`string1 ${`までしかマッチしてくれません。

そこで、以下のような正規表現を考えつきました。

/`(?:\$\{.*\}|[\s\S])*?(?<!(?<!\\)\\)`/

これで、

`string1 ${`string2`} string3`

`string1 ${`string2`} string3`としてマッチしてくれました。
また、

`string1 ${`string2 ${`string3`} string4`} string5`

と、多重ネストでも`string1 ${`string2 ${`string3`} string4`} string5`としてマッチしてくれます。

しかし、これはテンプレートリテラルだけの文字列で検証してるので、例えば

`string1` + `string2`

`string1`だけにマッチしますが、

`string1 ${`string2`}` + `string3`

としてしまうと、`string1 ${`string2`}`ではなく`string1 ${`string2`}` + `string3`でマッチしてしまいます。

これを`string1 ${`string2`}`のように正しくマッチさせるにはどうすればいいですか?

0

1Answer

可能かどうかはわかりませんが、一般論としてこのような入れ子になった構造は正規表現が苦手なジャンルです。
もし希望するような文字列にマッチするパターンが見つかったとしても、複雑になりすぎて修正が困難な代物になる可能性も高そうです。
なので正規表現で何とかしようとがんばるよりシンタックスハイライト関連の拡張機能などを使った方が無難だと思います。

0Like

Your answer might help someone💌