回答編集履歴
2
ソース修正
    
        answer	
    CHANGED
    
    | 
         @@ -43,6 +43,7 @@ 
     | 
|
| 
       43 
43 
     | 
    
         | 
| 
       44 
44 
     | 
    
         
             
            console.log(result); // => "山梨県 山りんごの天気 美味いりんご ヤマりんご県 りんごりんごりんご 山梨県"
         
     | 
| 
       45 
45 
     | 
    
         
             
            ```
         
     | 
| 
      
 46 
     | 
    
         
            +
            ➡ [サンプル](https://codepen.io/i8086x/pen/yLXaKqK?editors=0012)
         
     | 
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
            いくつか補足しときます。
         
     | 
| 
       48 
49 
     | 
    
         | 
1
ソース修正
    
        answer	
    CHANGED
    
    | 
         @@ -19,4 +19,39 @@ 
     | 
|
| 
       19 
19 
     | 
    
         
             
            console.log(textAfter); // => "山梨県 山りんごの天気 美味いりんご 山梨県 山りんごの天気 美味いりんご"
         
     | 
| 
       20 
20 
     | 
    
         
             
            ```
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
            ➡ [サンプル](https://codepen.io/i8086x/pen/oNwzEYp?editors=0012)
         
     | 
| 
      
 22 
     | 
    
         
            +
            ➡ [サンプル](https://codepen.io/i8086x/pen/oNwzEYp?editors=0012)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ### 動的にしたもの
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            置換対象(`梨`)、置換後(`りんご`)、置換対象外(`山梨県`) の各文字列を受け取る関数にしました。
         
     | 
| 
      
 28 
     | 
    
         
            +
            ```
         
     | 
| 
      
 29 
     | 
    
         
            +
            function replaceWithout(src, from, to, excluding) {
         
     | 
| 
      
 30 
     | 
    
         
            +
              const tokens = excluding.split(from).filter(e => e);
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
              if (tokens.length !== 2) {
         
     | 
| 
      
 33 
     | 
    
         
            +
                throw new Error(`excluding の中に、from が1回だけ出現しかつその from の前後に1文字以上の文字が存在する必要があります。`);
         
     | 
| 
      
 34 
     | 
    
         
            +
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
              
         
     | 
| 
      
 36 
     | 
    
         
            +
              const regexp = new RegExp(`(${tokens[0]})?${from}(${tokens[1]})?`, 'g');    
         
     | 
| 
      
 37 
     | 
    
         
            +
              return src.replace(regexp, (m, p1, p2) => p1 && p2 ? m : `${p1 || ''}${to}${p2 || ''}`);
         
     | 
| 
      
 38 
     | 
    
         
            +
            }
         
     | 
| 
      
 39 
     | 
    
         
            +
            ```
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            ```javascript
         
     | 
| 
      
 42 
     | 
    
         
            +
            const result = replaceWithout('山梨県 山梨の天気 美味い梨 ヤマ梨県 梨梨梨 山梨県', '梨', 'りんご', '山梨県');
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            console.log(result); // => "山梨県 山りんごの天気 美味いりんご ヤマりんご県 りんごりんごりんご 山梨県"
         
     | 
| 
      
 45 
     | 
    
         
            +
            ```
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            いくつか補足しときます。
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            - 例外 `excluding の中に、from が1回だけ出現しかつその from の前後に1文字以上の文字が存在する必要があります。` を投げているとおり、これが満たされないと、
         
     | 
| 
      
 50 
     | 
    
         
            +
            ```javascript
         
     | 
| 
      
 51 
     | 
    
         
            +
            const regexp = new RegExp(`(${tokens[0]})?${from}(${tokens[1]})?`, 'g');    
         
     | 
| 
      
 52 
     | 
    
         
            +
            ```
         
     | 
| 
      
 53 
     | 
    
         
            +
            が意図通り動作しないと思われます。
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            - 質問の要件を満たすreplaceを実行させる正規表現としては、Daregadaさんの回答の、否定後読みと、否定先読みを使うほうが、正規表現だけでやっつけてしまえるので、この回答よりも良いと思います。
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            - この回答は、「replace の第二引数に関数を渡せて、その関数に渡されてくる引数を使えば柔軟な変換が可能になる例」ぐらいの参考にしていただければええと思いますわ。
         
     |