正規表現で複数行のソースコードを一括置換したい


条件式に正規表現を使う場合どうすればいいのでしょうか？

[code]

    if (randomNum === 3) {
        if (inputAnswer === "パン") {
            correctAnswerEasyQ();
            commentary1.innerHTML = '【パン】';
            commentary2.innerHTML = 'たくさん！';
    
            getPoint10();
    
            description1.innerHTML = '';
        } else {
            mistakeAnswerEasyQ();
            commentary1.innerHTML = '【パン】';
            commentary2.innerHTML = 'たくさん！';
        }
    }
    
[/code]

を

[code]

    if (randomNum === 3) {
    
        while(i < answerNum) {
            var answerTxt = changeAnswer();
    
            if (answerTxt === 'パン') {
                correctAnswerEasyQ();
                commentary1.innerHTML = '【パン】';
                commentary2.innerHTML = 'たくさん！';
    
                getPoint10();
    
                flag = true;
    
                break;
            } else {
                falseNum++;
    
            }
    
            if(falseNum === answerNum && flag === false) {
                mistakeAnswerEasyQ();
                commentary1.innerHTML = '【パン】';
                commentary2.innerHTML = 'たくさん！';
            }
    
            i++;
        }
    
    }
    
[/code]

に変換したい

上記のようにサブライムで置換をしたいのですが正規表現でどう表現すればいいかがわかりません。

そして文字列の部分だけが基本的に違う同じ変換を数百行わないといけないのですが手動でやるには大変すぎます。  
何とか一括置換するアイデアはないでしょうか？

＿＿＿＿＿＿＿＿＿＿＿＿＿＿  
せめて下記のように文字列が違い、かつ下記のようにきれいに並んでいないものを一括でコピペできないでしょうか？  
inputAnswer === "パン"  
inputAnswer === "ごはん"  
inputAnswer === "いも"

これを個数分すべてひとつづつやっていくのは大変です。  
きれいに並んでいれば出来るのですが。

これが出来れば一度すべて変換後の形を張り付けて、それぞれ違う値は次にいっぺんにはり付けられます。




masmさんのおっしゃる通り、数百個の重複コードを1つの関数にまとめた方が今後のメンテナンスや機能拡張もしやすくなると思います。

何らかの理由で重複コードをまとめられない時には、正規表現での一括置換は理論上可能です。  
`(?s)`フラグを使うことで、[複数行の置換](http://tkymtk.hatenablog.com/entry/sublime-regex-
match-multi-lines-2014-01)ができます。

ただし1回の置換ですべてをこなそうとすると、正規表現の文字列が長くなりすぎて間違いを直すことも困難になります。  
下記のように段階を踏んで複数回置換をする方が良いでしょう。

  1. `if (randomNum === 3)` の下に`var answerTxt = changeAnswer();`までの3行を追加する
  2. `description1.innerHTML = '';`を`flag = true;`～`break`に置換する
  3. `} else {`以下を置換する  
...

実際に処理をすると、ifの中のインデントを追加する方法や、部分的に手入力でコード修正や改行が入っていて正規表現にマッチしない箇所に悩まされる可能性があります。

私なら正規表現のみで無理やり対応せずに、テキストエディタの[マクロ](https://webkaru.net/dev/mac-sublime-
macro/)機能を使います。  
上記の複数回置換の段階を踏んで書き換えを行うマクロを作成し、修正前と修正後のコードを差分比較しながら個々の書き換えを行います。

マクロでも書き換えができないほどイレギュラーパターンが多ければ、pythonやjavascriptで使い捨ての置換コードを作成します。  
対応方法は複数ありますので、最適な方法をご検討ください。

* * *

> せめて下記のように文字列が違い、かつ下記のようにきれいに並んでいないものを一括でコピペできないでしょうか？  
>  inputAnswer === "パン"  
>  inputAnswer === "ごはん"  
>  inputAnswer === "いも"

※元質問のソースコードは'パン'とシングルクォーテーションになっていますが、追加質問の通りダブルクォーテーションで回答します。

  1. `Find -> Find in files` で複数ファイル検索画面を開く
  2. 正規表現検索を有効にして、`Find:`に`inputAnswer\s*===\s*"[^"]+"`を入力する
  3. 検索対象でファイルを選択する
  4. 一覧で出てきた検索結果をコピペして別のテキストファイルに保存する
  5. 上記のテキストファイルをSublime Textで開きなおし、正規表現で置換する  
Find: `^.+(inputAnswer)\s*===\s*("[^"]+").*$  
Replace:`$1 === $2`

> 中身をすべて選択することがうまくいきません。これではだめなのでしょうか？.* if (inputAnswer.* }

私の回答のリンク先にある、複数行の置換は試していただいたでしょうか。  
カッコはグループ化に使用するので、検索文字として扱うならばエスケープが必要です。

`(?s)^if\s*\(inputAnswer.+?else.+?}`




masmさんのおっしゃる通り、数百個の重複コードを1つの関数にまとめた方が今後のメンテナンスや機能拡張もしやすくなると思います。

何らかの理由で重複コードをまとめられない時には、正規表現での一括置換は理論上可能です。  
`(?s)`フラグを使うことで、[複数行の置換](http://tkymtk.hatenablog.com/entry/sublime-regex-
match-multi-lines-2014-01)ができます。

ただし1回の置換ですべてをこなそうとすると、正規表現の文字列が長くなりすぎて間違いを直すことも困難になります。  
下記のように段階を踏んで複数回置換をする方が良いでしょう。

  1. `if (randomNum === 3)` の下に`var answerTxt = changeAnswer();`までの3行を追加する
  2. `description1.innerHTML = '';`を`flag = true;`～`break`に置換する
  3. `} else {`以下を置換する  
...

実際に処理をすると、ifの中のインデントを追加する方法や、部分的に手入力でコード修正や改行が入っていて正規表現にマッチしない箇所に悩まされる可能性があります。

私なら正規表現のみで無理やり対応せずに、テキストエディタの[マクロ](https://webkaru.net/dev/mac-sublime-
macro/)機能を使います。  
上記の複数回置換の段階を踏んで書き換えを行うマクロを作成し、修正前と修正後のコードを差分比較しながら個々の書き換えを行います。

マクロでも書き換えができないほどイレギュラーパターンが多ければ、pythonやjavascriptで使い捨ての置換コードを作成します。  
対応方法は複数ありますので、最適な方法をご検討ください。

* * *

> せめて下記のように文字列が違い、かつ下記のようにきれいに並んでいないものを一括でコピペできないでしょうか？  
>  inputAnswer === "パン"  
>  inputAnswer === "ごはん"  
>  inputAnswer === "いも"

※元質問のソースコードは'パン'とシングルクォーテーションになっていますが、追加質問の通りダブルクォーテーションで回答します。

  1. `Find -> Find in files` で複数ファイル検索画面を開く
  2. 正規表現検索を有効にして、`Find:`に`inputAnswer\s*===\s*"[^"]+"`を入力する
  3. 検索対象でファイルを選択する
  4. 一覧で出てきた検索結果をコピペして別のテキストファイルに保存する
  5. 上記のテキストファイルをSublime Textで開きなおし、正規表現で置換する  
Find: `^.+(inputAnswer)\s*===\s*("[^"]+").*$  
Replace:`$1 === $2`

> 中身をすべて選択することがうまくいきません。これではだめなのでしょうか？.* if (inputAnswer.* }

私の回答のリンク先にある、複数行の置換は試していただいたでしょうか。  
カッコはグループ化に使用するので、検索文字として扱うならばエスケープが必要です。

`(?s)^if\s*\(inputAnswer.+?else.+?}`

