ID非公開さん
2022/1/18 21:25
2回答
GAS、JavaScriptの正規表現の中に変数を入れたい
GAS、JavaScriptの正規表現の中に変数を入れたい bodyText.replace(/5\.(.*?)/g, "5.「$1」"); 内にある、「5」という部分を、代わりにスクリプト内で宣言した変数にて表現したいです。 文字結合の方法がわからないのですが、教えて頂けませんでしょうか?
JavaScript | プログラミング・223閲覧
ベストアンサー
■■■ 変数を使った正規表現 ■■■ 正規表現のパターン文字列 ──────────────── /文字列/g ──────────────── の「文字列」の部分に変数を使いたい場合は、 正規表現を new RegExp() を使って定義する。 ──────────────── new RegExp( "文字列", "g" ); ──────────────── 注意点として、 正規表現を new RegExp() で定義するとき、 文字列 "~" の中では、 パターン文字列で使う \ 記号はエスケープして \\ としないといけない。 たとえば、 質問の正規表現 ──────────────── /5\.(.*?)/g ──────────────── を new RegExp() で定義するときは、 ──────────────── new RegExp( "5\\.(.*?)", "g" ); ──────────────── のように記述する。 このパターン文字列 "5\\.(.*?)" の 5 の部分に、 例えば変数 num を当てたい場合は、 普通に変数と文字列を連結する要領で、 ──────────────── new RegExp( num+"\\.(.*?)", "g" ); ──────────────── のようにすればいい。 ■■■ replace() は非破壊のメソッド ■■■ 質問のコードで使用している replace() は、 文字列を置換した結果を戻り値として返すだけで、 もともとの文字列には変化を与えない非破壊のメソッド。 だから、 ──────────────── bodyText.replace( ~ ); ──────────────── のようにしても、 bodyText には何の変化も与えられていない。 起きていることは、 bodyText の一部を置き換えた新しい文字列を、 ただその場で叫んでいるだけ。 ──────────────── "新しい文字列"; ──────────────── このように、 文字列だけを書いたコードは何の意味もない。 bodyText の一部を置き換えたいのであれば、 ──────────────── bodyText = bodyText.replace( ~ ); ──────────────── のようにする。 ■■■ 実施例 ■■■ 上記の回答の内容を踏まえて、 簡単なスクリプト例。 ──────────────── // 変数 const num = 5; // 正規表現 const reg = new RegExp( num+"\\.(.*?)", "g" ); // 文字列 let bodyText = "5.あいうえお"; // 置換 bodyText = bodyText.replace( reg, "5.「$1」" ); // 結果 console.log( bodyText ); //→ "5.「」あいうえお" ──────────────── なお、 正規表現 (.*?) は、 「0 個または 1 個の任意の文字列」の「最短マッチング」だから、 「0 個の任意文字列」でマッチしてしまうため、 "5.あいうえお" の置換結果は "5.「あいうえお」" ではなく、 "5.「」あいうえお" になっている。
質問者からのお礼コメント
皆様ありがとうございます。
お礼日時:1/23 14:24