teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

String.prototype.replace

2019/07/25 03:49

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### encodeURIComponent
2
+
1
3
  - 半角 … size=1
2
4
  - 全角 … size=2, 2byte以上(UTF-8基準)
3
5
  ```JavaScript
@@ -7,4 +9,25 @@
7
9
  console.log(size);
8
10
  ```
9
11
 
12
+ ### String.prototype.replace()
13
+
14
+ 正規表現で全角文字を2文字に置換する方法。
15
+ (**サロゲートペア**はしっかり調べてないので、別途問題がないか確認下さい)
16
+
17
+ ```JavaScript
18
+ strimg.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\s\S]/g, char => encodeURIComponent(char).length > 3 ? 'ZZ', char).length
19
+ ```
20
+
21
+ 実装が対応しているなら、`su` フラグを使うことで正規表現パターンをシンプルに出来ます?
22
+ https://jsprimer.net/basic/string-unicode/
23
+ http://js-next.hatenablog.com/entry/2018/09/08/225552
24
+
25
+ ```JavaScript
26
+ strimg.replace(/./gsu, char => encodeURIComponent(char).length > 3 ? 'ZZ', char).length
27
+ ```
28
+
29
+ ただし、これらは正規表現を利用する為に、無理やりダミー文字列を生成しているコードであり、洗練されたコードではないと私は思います。
30
+
31
+ 正規表現は、**検索**と**置換**を行うための文法であり、文字列をカウントする機能はありません。
32
+
10
33
  Re: chiruchiru さん