回答編集履歴

11

テキスト修正

2019/01/13 05:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
 
74
74
 
75
- `while`で回したりしなくても、以下で済むかもれません
75
+ 単語の後にくる文字までマッチさせなければ、`while`で回したりせずに以下で済みま
76
76
 
77
77
 
78
78
 

10

テキスト修正

2019/01/13 05:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -65,3 +65,23 @@
65
65
 
66
66
 
67
67
  以上、参考になれば幸いです。
68
+
69
+
70
+
71
+ ### 追記
72
+
73
+
74
+
75
+ `while`で回したりしなくても、以下で済むかもしれません。
76
+
77
+
78
+
79
+ ```javascript
80
+
81
+ const maskingWordsInSpeech =
82
+
83
+ (text) => text.replace(/[^a-z[(][a-z]+/ig, s => s.replace(/[a-z]/ig, '_'));
84
+
85
+ ```
86
+
87
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/25/](https://jsfiddle.net/jun68ykt/Lrae1fw3/25/)

9

テキスト修正

2019/01/13 05:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- この条件に沿えば、会話中の単語、これを囲む左右の文字を含めると、正規表現
17
+ この条件に沿って、会話中の単語、これを囲む左右の文字を含め正規表現
18
18
 
19
19
 
20
20
 
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- マッチします。この両端を含めたマッチ部分について、アルファベットを `_` に変換するような関数
25
+ マッチさせ、このマッチ部分に含まれるアルファベットを `_` に変換するような関数
26
26
 
27
27
  `maskingWordsInSpeech(text)`
28
28
 

8

テキスト修正

2019/01/13 04:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,21 +2,9 @@
2
2
 
3
3
 
4
4
 
5
- 以下の回答では、考え方として、
6
-
7
- - まず、**台詞中の単語**(words in speech) が満たす条件を挙げる。
8
-
9
- - 次、台詞中の単語の伏せ字にるコードを実装
5
+ 会話出現する単語は、以下条件満たものと考えられます。
10
6
 
11
7
 
12
-
13
- というステップを踏みました。
14
-
15
- まず、**台詞中の単語** は以下の条件を満たすものと考えられます。
16
-
17
-
18
-
19
- > 台詞中の単語は、
20
8
 
21
9
  - 半角アルファベット1文字以上で構成される文字列で、
22
10
 
@@ -26,7 +14,7 @@
26
14
 
27
15
 
28
16
 
29
- この条件に沿えば、台詞中の単語は、これを囲む左右の文字を含めると、正規表現
17
+ この条件に沿えば、会話中の単語は、これを囲む左右の文字を含めると、正規表現
30
18
 
31
19
 
32
20
 
@@ -38,7 +26,7 @@
38
26
 
39
27
  `maskingWordsInSpeech(text)`
40
28
 
41
- を作りま以下はその一例です。
29
+ を作りました
42
30
 
43
31
 
44
32
 

7

テキスト修正

2019/01/13 04:54

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- この条件に沿えば、台詞中の単語およびこれを囲む両端の文字、正規表現
29
+ この条件に沿えば、台詞中の単語は、これを囲む左右の文字を含めると、正規表現
30
30
 
31
31
 
32
32
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- にマッチします。この両端含マッチ部分について、アルファベットを `_` に変換するような関数
37
+ にマッチします。この両端めたマッチ部分について、アルファベットを `_` に変換するような関数
38
38
 
39
39
  `maskingWordsInSpeech(text)`
40
40
 

6

テキスト修正

2019/01/13 04:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
33
+ `/[^a-z([][a-z]+[^a-z)]]/i`
34
34
 
35
35
 
36
36
 
@@ -50,9 +50,9 @@
50
50
 
51
51
  while(true) {
52
52
 
53
- const y = x.replace(/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/,
53
+ const y = x.replace(/[^a-z([][a-z]+[^a-z)]]/i,
54
54
 
55
- str => str.replace(/[a-zA-Z]/g, '_')
55
+ str => str.replace(/[a-z]/ig, '_')
56
56
 
57
57
  );
58
58
 
@@ -70,7 +70,7 @@
70
70
 
71
71
 
72
72
 
73
- - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)
73
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/13/](https://jsfiddle.net/jun68ykt/Lrae1fw3/13/)
74
74
 
75
75
 
76
76
 

5

テキスト修正

2019/01/13 04:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -4,51 +4,33 @@
4
4
 
5
5
  以下の回答では、考え方として、
6
6
 
7
- - まず、**台詞中の単語**(words in speech) という概念定義する。
7
+ - まず、**台詞中の単語**(words in speech) が満たす条件挙げる。
8
8
 
9
9
  - 次に、台詞中の単語のみを伏せ字にするコードを実装する。
10
10
 
11
11
 
12
12
 
13
+ というステップを踏みました。
13
14
 
14
-
15
- いうステップを踏みした
15
+ まず、**台詞中の単語** は以下の条件を満たすもの考えられ
16
16
 
17
17
 
18
18
 
19
+ > 台詞中の単語は、
19
20
 
21
+ - 半角アルファベット1文字以上で構成される文字列で、
20
22
 
21
- まず**台詞中単語** を、(ひとま)以下のように定義しました
23
+ - かつ文字列の直前にある文字は、アルファベットおよび`(`, `[` のいれでもない
24
+
25
+ - かつ、その文字列の直後にある文字は、アルファベットおよび`)`, `]` のいずれでもない。
22
26
 
23
27
 
24
28
 
25
-
26
-
27
- > **台詞中の単語**とは、半角アルファベット1文字以上で構成さ文字列でかつ、その両端がともに以下
29
+ この条件に沿えば、台詞中の単語およびこを囲む両端の文字正規表現
28
-
29
- - スペース
30
-
31
- - ピリオド
32
-
33
- - カンマ
34
-
35
- - 疑問符
36
-
37
- - 感嘆符
38
-
39
- - 二重引用符
40
30
 
41
31
 
42
32
 
43
- > のいずれかの半角文字で囲まれているものをいう。
44
-
45
-
46
-
47
- この定義に沿えば、台詞中の単語およびこれを囲む両端の記号は、正規表現
48
-
49
-
50
-
51
- `/[ .,?!"][a-zA-Z]+[ .,?!"]/`
33
+ `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
52
34
 
53
35
 
54
36
 
@@ -68,7 +50,7 @@
68
50
 
69
51
  while(true) {
70
52
 
71
- const y = x.replace(/[ .,?!"][a-zA-Z]+[ .,?!"]/,
53
+ const y = x.replace(/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/,
72
54
 
73
55
  str => str.replace(/[a-zA-Z]/g, '_')
74
56
 
@@ -88,40 +70,10 @@
88
70
 
89
71
 
90
72
 
91
- 上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルを以下に作成しました。
92
-
93
-
94
-
95
- - [https://jsfiddle.net/jun68ykt/Lrae1fw3/6/](https://jsfiddle.net/jun68ykt/Lrae1fw3/6/)
73
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)
96
-
97
-
98
-
99
-
100
-
101
- なお、冒頭に書いた「台詞中の単語」の定義は、gpioblinkさんの要件によっては、修正または拡張が必要かもしれません。
102
74
 
103
75
 
104
76
 
105
77
 
106
78
 
107
79
  以上、参考になれば幸いです。
108
-
109
-
110
-
111
- ### 追記
112
-
113
-
114
-
115
- **台詞中の単語** をキャプチャする正規表現は、冒頭の定義のような両端の文字を制約するものではなく、両端にあってはいけない文字を指定するほうがよいかもしれません。そうすると
116
-
117
-
118
-
119
- `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
120
-
121
-
122
-
123
- というものになるかと思います。以下は上記の正規表現を使ったサンプルです。
124
-
125
-
126
-
127
- - [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)

4

テキスト修正

2019/01/13 04:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -48,11 +48,11 @@
48
48
 
49
49
 
50
50
 
51
- `/([ .,?!"])([a-zA-Z]+)([ .,?!"])/`
51
+ `/[ .,?!"][a-zA-Z]+[ .,?!"]/`
52
52
 
53
53
 
54
54
 
55
- マッチさせたときの各キャプチャ `(・・・)`で取得できます。れを使って、入力されたテキスト `text` に含まれる、台詞中の単語べてを、各単語の文字数と同じ数の`_`で構成され文字列で置き換える関数
55
+ マッチます。この両端含むマッチ部分について、アルファベッ `_` に変換するような関数
56
56
 
57
57
  `maskingWordsInSpeech(text)`
58
58
 
@@ -68,9 +68,9 @@
68
68
 
69
69
  while(true) {
70
70
 
71
- const y = x.replace(/([ .,?!"])([a-zA-Z]+)([ .,?!"])/,
71
+ const y = x.replace(/[ .,?!"][a-zA-Z]+[ .,?!"]/,
72
72
 
73
- (...m) => `${m[1]}${'_'.repeat(m[2].length)}${m[3]}`
73
+ str => str.replace(/[a-zA-Z]/g, '_')
74
74
 
75
75
  );
76
76
 
@@ -92,7 +92,7 @@
92
92
 
93
93
 
94
94
 
95
- - [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
95
+ - [https://jsfiddle.net/jun68ykt/Lrae1fw3/6/](https://jsfiddle.net/jun68ykt/Lrae1fw3/6/)
96
96
 
97
97
 
98
98
 
@@ -116,7 +116,7 @@
116
116
 
117
117
 
118
118
 
119
- `/([^a-zA-Z[(])([a-zA-Z]+)([^a-zA-Z)]])/`
119
+ `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
120
120
 
121
121
 
122
122
 
@@ -124,4 +124,4 @@
124
124
 
125
125
 
126
126
 
127
- - [https://jsfiddle.net/jun68ykt/Lp7y40t3/11/](https://jsfiddle.net/jun68ykt/Lp7y40t3/11/)
127
+ - [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)

3

テキスト修正

2019/01/13 04:17

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -44,27 +44,7 @@
44
44
 
45
45
 
46
46
 
47
-
48
-
49
-
50
-
51
- この定義でいくと、たとえば、
52
-
53
-
54
-
55
- 文字列 ` hello ` に出現する `hello` は台詞中の単語である。
56
-
57
- 文字列 `[TOM]` に出現する `TOM` は台詞中の単語ではない。
58
-
59
- 文字列 `"Hi,` に出現する `Hi` は台詞中の単語である。
60
-
61
-
62
-
63
- となります。
64
-
65
-
66
-
67
- 上記の定義をふまると、台詞中の単語およびこれを囲む両端の記号は、正規表現
47
+ の定義に沿、台詞中の単語およびこれを囲む両端の記号は、正規表現
68
48
 
69
49
 
70
50
 
@@ -72,7 +52,7 @@
72
52
 
73
53
 
74
54
 
75
- でマッチさせたときの各キャプチャ `(・・・)`で取得できます。。これを使って、入力されたテキスト `text` に含まれる、台詞中の単語すべてを、各単語の文字数と同じ数の`_`で構成される文字列で置き換える関数
55
+ でマッチさせたときの各キャプチャ `(・・・)`で取得できます。。これを使って、入力されたテキスト `text` に含まれる、台詞中の単語すべてを、各単語の文字数と同じ数の`_`で構成される文字列で置き換える関数
76
56
 
77
57
  `maskingWordsInSpeech(text)`
78
58
 
@@ -108,7 +88,7 @@
108
88
 
109
89
 
110
90
 
111
- 以下は、上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルです
91
+ 上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルを以下に作成しました
112
92
 
113
93
 
114
94
 

2

テキスト修正

2019/01/13 03:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -108,51 +108,11 @@
108
108
 
109
109
 
110
110
 
111
- 以下は、`maskingWordsInSpeech(text)` の使用例です。
111
+ 以下は、上記の`maskingWordsInSpeech(text)` を動作確認するためサンプルです。
112
112
 
113
113
 
114
114
 
115
- ```javascript
116
-
117
- // 以下、テスト
118
-
119
- [
120
-
121
- '-[TOM] ♪ Taking care to keep my baggage with me ♪',
122
-
123
- '-(banging) Huh?',
124
-
125
- '- Are you hungry?',
126
-
127
- '-[SNOOPY] I am hungry. (sigh)'
128
-
129
- ].forEach(
130
-
131
- text => console.log(maskingWordsInSpeech(text))
132
-
133
- );
134
-
135
- ```
136
-
137
-
138
-
139
- 出力結果は以下となります。
140
-
141
- ```
142
-
143
- -[TOM] ♪ ______ ____ __ ____ __ _______ ____ __ ♪
144
-
145
- -(banging) ___?
146
-
147
- - ___ ___ ______?
148
-
149
- -[SNOOPY] _ __ ______. (sigh)
150
-
151
- ```
152
-
153
-
154
-
155
- - **上記を試すためのサンプル: ** [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
115
+ - [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
156
116
 
157
117
 
158
118
 

1

テキスト修正

2019/01/13 03:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -165,3 +165,23 @@
165
165
 
166
166
 
167
167
  以上、参考になれば幸いです。
168
+
169
+
170
+
171
+ ### 追記
172
+
173
+
174
+
175
+ **台詞中の単語** をキャプチャする正規表現は、冒頭の定義のような両端の文字を制約するものではなく、両端にあってはいけない文字を指定するほうがよいかもしれません。そうすると
176
+
177
+
178
+
179
+ `/([^a-zA-Z[(])([a-zA-Z]+)([^a-zA-Z)]])/`
180
+
181
+
182
+
183
+ というものになるかと思います。以下は上記の正規表現を使ったサンプルです。
184
+
185
+
186
+
187
+ - [https://jsfiddle.net/jun68ykt/Lp7y40t3/11/](https://jsfiddle.net/jun68ykt/Lp7y40t3/11/)