回答編集履歴

2

ソース修正

2021/09/05 06:41

投稿

退会済みユーザー
test CHANGED
@@ -88,6 +88,8 @@
88
88
 
89
89
  ```
90
90
 
91
+ ➡ [サンプル](https://codepen.io/i8086x/pen/yLXaKqK?editors=0012)
92
+
91
93
 
92
94
 
93
95
  いくつか補足しときます。

1

ソース修正

2021/09/05 06:41

投稿

退会済みユーザー
test CHANGED
@@ -41,3 +41,73 @@
41
41
 
42
42
 
43
43
  ➡ [サンプル](https://codepen.io/i8086x/pen/oNwzEYp?editors=0012)
44
+
45
+
46
+
47
+
48
+
49
+ ### 動的にしたもの
50
+
51
+
52
+
53
+ 置換対象(`梨`)、置換後(`りんご`)、置換対象外(`山梨県`) の各文字列を受け取る関数にしました。
54
+
55
+ ```
56
+
57
+ function replaceWithout(src, from, to, excluding) {
58
+
59
+ const tokens = excluding.split(from).filter(e => e);
60
+
61
+
62
+
63
+ if (tokens.length !== 2) {
64
+
65
+ throw new Error(`excluding の中に、from が1回だけ出現しかつその from の前後に1文字以上の文字が存在する必要があります。`);
66
+
67
+ }
68
+
69
+
70
+
71
+ const regexp = new RegExp(`(${tokens[0]})?${from}(${tokens[1]})?`, 'g');
72
+
73
+ return src.replace(regexp, (m, p1, p2) => p1 && p2 ? m : `${p1 || ''}${to}${p2 || ''}`);
74
+
75
+ }
76
+
77
+ ```
78
+
79
+
80
+
81
+ ```javascript
82
+
83
+ const result = replaceWithout('山梨県 山梨の天気 美味い梨 ヤマ梨県 梨梨梨 山梨県', '梨', 'りんご', '山梨県');
84
+
85
+
86
+
87
+ console.log(result); // => "山梨県 山りんごの天気 美味いりんご ヤマりんご県 りんごりんごりんご 山梨県"
88
+
89
+ ```
90
+
91
+
92
+
93
+ いくつか補足しときます。
94
+
95
+
96
+
97
+ - 例外 `excluding の中に、from が1回だけ出現しかつその from の前後に1文字以上の文字が存在する必要があります。` を投げているとおり、これが満たされないと、
98
+
99
+ ```javascript
100
+
101
+ const regexp = new RegExp(`(${tokens[0]})?${from}(${tokens[1]})?`, 'g');
102
+
103
+ ```
104
+
105
+ が意図通り動作しないと思われます。
106
+
107
+
108
+
109
+ - 質問の要件を満たすreplaceを実行させる正規表現としては、Daregadaさんの回答の、否定後読みと、否定先読みを使うほうが、正規表現だけでやっつけてしまえるので、この回答よりも良いと思います。
110
+
111
+
112
+
113
+ - この回答は、「replace の第二引数に関数を渡せて、その関数に渡されてくる引数を使えば柔軟な変換が可能になる例」ぐらいの参考にしていただければええと思いますわ。