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

回答編集履歴

11

テキスト修正

2019/01/13 05:41

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -35,7 +35,7 @@
35
35
 
36
36
  ### 追記
37
37
 
38
- `while`で回したりしなくても、以下で済むかもしれせん
38
+ 単語の後にくる文字までマッチさせなければ、`while`で回したりせずに以下で済した
39
39
 
40
40
  ```javascript
41
41
  const maskingWordsInSpeech =

10

テキスト修正

2019/01/13 05:41

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -31,4 +31,14 @@
31
31
  - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/13/](https://jsfiddle.net/jun68ykt/Lrae1fw3/13/)
32
32
 
33
33
 
34
- 以上、参考になれば幸いです。
34
+ 以上、参考になれば幸いです。
35
+
36
+ ### 追記
37
+
38
+ `while`で回したりしなくても、以下で済むかもしれません。
39
+
40
+ ```javascript
41
+ const maskingWordsInSpeech =
42
+ (text) => text.replace(/[^a-z[(][a-z]+/ig, s => s.replace(/[a-z]/ig, '_'));
43
+ ```
44
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/25/](https://jsfiddle.net/jun68ykt/Lrae1fw3/25/)

9

テキスト修正

2019/01/13 05:32

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -6,11 +6,11 @@
6
6
  - かつ、その文字列の直前にある文字は、アルファベットおよび`(`, `[` のいずれでもない。
7
7
  - かつ、その文字列の直後にある文字は、アルファベットおよび`)`, `]` のいずれでもない。
8
8
 
9
- この条件に沿えば、会話中の単語、これを囲む左右の文字を含めると、正規表現
9
+ この条件に沿って、会話中の単語、これを囲む左右の文字を含め正規表現
10
10
 
11
11
  `/[^a-z([][a-z]+[^a-z)]]/i`
12
12
 
13
- マッチします。この両端を含めたマッチ部分について、アルファベットを `_` に変換するような関数
13
+ マッチさせ、このマッチ部分に含まれるアルファベットを `_` に変換するような関数
14
14
  `maskingWordsInSpeech(text)`
15
15
  を作りました。
16
16
 

8

テキスト修正

2019/01/13 04:57

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,24 +1,18 @@
1
1
  こんにちは。
2
2
 
3
- 以下の回答では、考え方として、
4
- - まず、**台詞中の単語**(words in speech) が満たす条件を挙げる。
5
- - 次、台詞中の単語の伏せ字にるコードを実装
3
+ 会話出現する単語は、以下条件満たものと考えられます。
6
4
 
7
- というステップを踏みました。
8
- まず、**台詞中の単語** は以下の条件を満たすものと考えられます。
9
-
10
- > 台詞中の単語は、
11
5
  - 半角アルファベット1文字以上で構成される文字列で、
12
6
  - かつ、その文字列の直前にある文字は、アルファベットおよび`(`, `[` のいずれでもない。
13
7
  - かつ、その文字列の直後にある文字は、アルファベットおよび`)`, `]` のいずれでもない。
14
8
 
15
- この条件に沿えば、台詞中の単語は、これを囲む左右の文字を含めると、正規表現
9
+ この条件に沿えば、会話中の単語は、これを囲む左右の文字を含めると、正規表現
16
10
 
17
11
  `/[^a-z([][a-z]+[^a-z)]]/i`
18
12
 
19
13
  にマッチします。この両端を含めたマッチ部分について、アルファベットを `_` に変換するような関数
20
14
  `maskingWordsInSpeech(text)`
21
- を作りま以下はその一例です。
15
+ を作りました
22
16
 
23
17
  ```javascript
24
18
  const maskingWordsInSpeech = (text) => {

7

テキスト修正

2019/01/13 04:54

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -12,11 +12,11 @@
12
12
  - かつ、その文字列の直前にある文字は、アルファベットおよび`(`, `[` のいずれでもない。
13
13
  - かつ、その文字列の直後にある文字は、アルファベットおよび`)`, `]` のいずれでもない。
14
14
 
15
- この条件に沿えば、台詞中の単語およびこれを囲む両端の文字、正規表現
15
+ この条件に沿えば、台詞中の単語は、これを囲む左右の文字を含めると、正規表現
16
16
 
17
17
  `/[^a-z([][a-z]+[^a-z)]]/i`
18
18
 
19
- にマッチします。この両端含マッチ部分について、アルファベットを `_` に変換するような関数
19
+ にマッチします。この両端めたマッチ部分について、アルファベットを `_` に変換するような関数
20
20
  `maskingWordsInSpeech(text)`
21
21
  を作ります。以下はその一例です。
22
22
 

6

テキスト修正

2019/01/13 04:48

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  この条件に沿えば、台詞中の単語およびこれを囲む両端の文字は、正規表現
16
16
 
17
- `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
17
+ `/[^a-z([][a-z]+[^a-z)]]/i`
18
18
 
19
19
  にマッチします。この両端含むマッチ部分について、アルファベットを `_` に変換するような関数
20
20
  `maskingWordsInSpeech(text)`
@@ -24,8 +24,8 @@
24
24
  const maskingWordsInSpeech = (text) => {
25
25
  let x = text;
26
26
  while(true) {
27
- const y = x.replace(/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/,
27
+ const y = x.replace(/[^a-z([][a-z]+[^a-z)]]/i,
28
- str => str.replace(/[a-zA-Z]/g, '_')
28
+ str => str.replace(/[a-z]/ig, '_')
29
29
  );
30
30
  if (x == y) break;
31
31
  x = y;
@@ -34,7 +34,7 @@
34
34
  };
35
35
  ```
36
36
 
37
- - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)
37
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/13/](https://jsfiddle.net/jun68ykt/Lrae1fw3/13/)
38
38
 
39
39
 
40
40
  以上、参考になれば幸いです。

5

テキスト修正

2019/01/13 04:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,30 +1,21 @@
1
1
  こんにちは。
2
2
 
3
3
  以下の回答では、考え方として、
4
- - まず、**台詞中の単語**(words in speech) という概念を定義する。
4
+ - まず、**台詞中の単語**(words in speech) が満た条件を挙げる。
5
5
  - 次に、台詞中の単語のみを伏せ字にするコードを実装する。
6
6
 
7
-
8
7
  というステップを踏みました。
8
+ まず、**台詞中の単語** は以下の条件を満たすものと考えられます。
9
9
 
10
+ > 台詞中の単語は、
11
+ - 半角アルファベット1文字以上で構成される文字列で、
12
+ - かつ、その文字列の直前にある文字は、アルファベットおよび`(`, `[` のいずれでもない。
13
+ - かつ、その文字列の直後にある文字は、アルファベットおよび`)`, `]` のいずれでもない。
10
14
 
11
- まず**台詞中の単語** 、(ひとまず)以下ように定義しました。
15
+ この条件に沿えば、台詞中の単語およびこれ囲む両端文字は、正規表現
12
16
 
17
+ `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
13
18
 
14
- > **台詞中の単語**とは、半角アルファベット1文字以上で構成される文字列で、かつ、その両端がともに以下
15
- - スペース
16
- - ピリオド
17
- - カンマ
18
- - 疑問符
19
- - 感嘆符
20
- - 二重引用符
21
-
22
- > のいずれかの半角文字で囲まれているものをいう。
23
-
24
- この定義に沿えば、台詞中の単語およびこれを囲む両端の記号は、正規表現
25
-
26
- `/[ .,?!"][a-zA-Z]+[ .,?!"]/`
27
-
28
19
  にマッチします。この両端含むマッチ部分について、アルファベットを `_` に変換するような関数
29
20
  `maskingWordsInSpeech(text)`
30
21
  を作ります。以下はその一例です。
@@ -33,7 +24,7 @@
33
24
  const maskingWordsInSpeech = (text) => {
34
25
  let x = text;
35
26
  while(true) {
36
- const y = x.replace(/[ .,?!"][a-zA-Z]+[ .,?!"]/,
27
+ const y = x.replace(/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/,
37
28
  str => str.replace(/[a-zA-Z]/g, '_')
38
29
  );
39
30
  if (x == y) break;
@@ -43,22 +34,7 @@
43
34
  };
44
35
  ```
45
36
 
46
- 上記の`maskingWordsInSpeech(text)` 動作確認するためのサンプルを以下に作成しました。
37
+ - **動作確認のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)
47
38
 
48
- - [https://jsfiddle.net/jun68ykt/Lrae1fw3/6/](https://jsfiddle.net/jun68ykt/Lrae1fw3/6/)
49
39
 
50
-
51
- なお、冒頭に書いた「台詞中の単語」の定義は、gpioblinkさんの要件によっては、修正または拡張が必要かもしれません。
52
-
53
-
54
- 以上、参考になれば幸いです。
40
+ 以上、参考になれば幸いです。
55
-
56
- ### 追記
57
-
58
- **台詞中の単語** をキャプチャする正規表現は、冒頭の定義のような両端の文字を制約するものではなく、両端にあってはいけない文字を指定するほうがよいかもしれません。そうすると
59
-
60
- `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
61
-
62
- というものになるかと思います。以下は上記の正規表現を使ったサンプルです。
63
-
64
- - [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)

4

テキスト修正

2019/01/13 04:31

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -23,9 +23,9 @@
23
23
 
24
24
  この定義に沿えば、台詞中の単語およびこれを囲む両端の記号は、正規表現
25
25
 
26
- `/([ .,?!"])([a-zA-Z]+)([ .,?!"])/`
26
+ `/[ .,?!"][a-zA-Z]+[ .,?!"]/`
27
27
 
28
- マッチさせたときの各キャプチャ `(・・・)`で取得できます。れを使って、入力されたテキスト `text` に含まれる、台詞中の単語べてを、各単語の文字数と同じ数の`_`で構成され文字列で置き換える関数
28
+ マッチます。この両端含むマッチ部分について、アルファベッ `_` に変換するような関数
29
29
  `maskingWordsInSpeech(text)`
30
30
  を作ります。以下はその一例です。
31
31
 
@@ -33,8 +33,8 @@
33
33
  const maskingWordsInSpeech = (text) => {
34
34
  let x = text;
35
35
  while(true) {
36
- const y = x.replace(/([ .,?!"])([a-zA-Z]+)([ .,?!"])/,
36
+ const y = x.replace(/[ .,?!"][a-zA-Z]+[ .,?!"]/,
37
- (...m) => `${m[1]}${'_'.repeat(m[2].length)}${m[3]}`
37
+ str => str.replace(/[a-zA-Z]/g, '_')
38
38
  );
39
39
  if (x == y) break;
40
40
  x = y;
@@ -45,7 +45,7 @@
45
45
 
46
46
  上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルを以下に作成しました。
47
47
 
48
- - [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
48
+ - [https://jsfiddle.net/jun68ykt/Lrae1fw3/6/](https://jsfiddle.net/jun68ykt/Lrae1fw3/6/)
49
49
 
50
50
 
51
51
  なお、冒頭に書いた「台詞中の単語」の定義は、gpioblinkさんの要件によっては、修正または拡張が必要かもしれません。
@@ -57,8 +57,8 @@
57
57
 
58
58
  **台詞中の単語** をキャプチャする正規表現は、冒頭の定義のような両端の文字を制約するものではなく、両端にあってはいけない文字を指定するほうがよいかもしれません。そうすると
59
59
 
60
- `/([^a-zA-Z[(])([a-zA-Z]+)([^a-zA-Z)]])/`
60
+ `/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
61
61
 
62
62
  というものになるかと思います。以下は上記の正規表現を使ったサンプルです。
63
63
 
64
- - [https://jsfiddle.net/jun68ykt/Lp7y40t3/11/](https://jsfiddle.net/jun68ykt/Lp7y40t3/11/)
64
+ - [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)

3

テキスト修正

2019/01/13 04:17

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -21,21 +21,11 @@
21
21
 
22
22
  > のいずれかの半角文字で囲まれているものをいう。
23
23
 
24
+ この定義に沿えば、台詞中の単語およびこれを囲む両端の記号は、正規表現
24
25
 
25
-
26
- この定義でいくと、たとえば、
27
-
28
- 文字列 ` hello ` に出現する `hello` は台詞中の単語である。
29
- 文字列 `[TOM]` に出現する `TOM` は台詞中の単語ではない。
30
- 文字列 `"Hi,` に出現する `Hi` は台詞中の単語である。
31
-
32
- となります。
33
-
34
- 上記の定義をふまえると、台詞中の単語およびこれを囲む両端の記号は、正規表現
35
-
36
26
  `/([ .,?!"])([a-zA-Z]+)([ .,?!"])/`
37
27
 
38
- でマッチさせたときの各キャプチャ `(・・・)`で取得できます。。これを使って、入力されたテキスト `text` に含まれる、台詞中の単語すべてを、各単語の文字数と同じ数の`_`で構成される文字列で置き換える関数
28
+ でマッチさせたときの各キャプチャ `(・・・)`で取得できます。。これを使って、入力されたテキスト `text` に含まれる、台詞中の単語すべてを、各単語の文字数と同じ数の`_`で構成される文字列で置き換える関数
39
29
  `maskingWordsInSpeech(text)`
40
30
  を作ります。以下はその一例です。
41
31
 
@@ -53,7 +43,7 @@
53
43
  };
54
44
  ```
55
45
 
56
- 以下は、上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルです
46
+ 上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルを以下に作成しました
57
47
 
58
48
  - [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
59
49
 

2

テキスト修正

2019/01/13 03:55

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -53,31 +53,11 @@
53
53
  };
54
54
  ```
55
55
 
56
- 以下は、`maskingWordsInSpeech(text)` の使用例です。
56
+ 以下は、上記の`maskingWordsInSpeech(text)` を動作確認するためサンプルです。
57
57
 
58
- ```javascript
59
- // 以下、テスト
60
- [
61
- '-[TOM] ♪ Taking care to keep my baggage with me ♪',
58
+ - [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
62
- '-(banging) Huh?',
63
- '- Are you hungry?',
64
- '-[SNOOPY] I am hungry. (sigh)'
65
- ].forEach(
66
- text => console.log(maskingWordsInSpeech(text))
67
- );
68
- ```
69
59
 
70
- 出力結果は以下となります。
71
- ```
72
- -[TOM] ♪ ______ ____ __ ____ __ _______ ____ __ ♪
73
- -(banging) ___?
74
- - ___ ___ ______?
75
- -[SNOOPY] _ __ ______. (sigh)
76
- ```
77
60
 
78
- - **上記を試すためのサンプル: ** [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
79
-
80
-
81
61
  なお、冒頭に書いた「台詞中の単語」の定義は、gpioblinkさんの要件によっては、修正または拡張が必要かもしれません。
82
62
 
83
63
 

1

テキスト修正

2019/01/13 03:48

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -81,4 +81,14 @@
81
81
  なお、冒頭に書いた「台詞中の単語」の定義は、gpioblinkさんの要件によっては、修正または拡張が必要かもしれません。
82
82
 
83
83
 
84
- 以上、参考になれば幸いです。
84
+ 以上、参考になれば幸いです。
85
+
86
+ ### 追記
87
+
88
+ **台詞中の単語** をキャプチャする正規表現は、冒頭の定義のような両端の文字を制約するものではなく、両端にあってはいけない文字を指定するほうがよいかもしれません。そうすると
89
+
90
+ `/([^a-zA-Z[(])([a-zA-Z]+)([^a-zA-Z)]])/`
91
+
92
+ というものになるかと思います。以下は上記の正規表現を使ったサンプルです。
93
+
94
+ - [https://jsfiddle.net/jun68ykt/Lp7y40t3/11/](https://jsfiddle.net/jun68ykt/Lp7y40t3/11/)