回答編集履歴
11
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
この条件に沿えば、台詞中の単語およびこれを囲む両端の文字は、正規表現
|
16
16
|
|
17
|
-
`/[^a-
|
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-
|
27
|
+
const y = x.replace(/[^a-z([][a-z]+[^a-z)]]/i,
|
28
|
-
str => str.replace(/[a-
|
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/
|
37
|
+
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/Lrae1fw3/13/](https://jsfiddle.net/jun68ykt/Lrae1fw3/13/)
|
38
38
|
|
39
39
|
|
40
40
|
以上、参考になれば幸いです。
|
5
テキスト修正
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(/[
|
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
|
-
|
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
テキスト修正
answer
CHANGED
@@ -23,9 +23,9 @@
|
|
23
23
|
|
24
24
|
この定義に沿えば、台詞中の単語およびこれを囲む両端の記号は、正規表現
|
25
25
|
|
26
|
-
`/
|
26
|
+
`/[ .,?!"][a-zA-Z]+[ .,?!"]/`
|
27
27
|
|
28
|
-
|
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(/
|
36
|
+
const y = x.replace(/[ .,?!"][a-zA-Z]+[ .,?!"]/,
|
37
|
-
|
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/
|
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
|
-
`/
|
60
|
+
`/[^a-zA-Z[(][a-zA-Z]+[^a-zA-Z)]]/`
|
61
61
|
|
62
62
|
というものになるかと思います。以下は上記の正規表現を使ったサンプルです。
|
63
63
|
|
64
|
-
- [https://jsfiddle.net/jun68ykt/
|
64
|
+
- [https://jsfiddle.net/jun68ykt/Lrae1fw3/7/](https://jsfiddle.net/jun68ykt/Lrae1fw3/7/)
|
3
テキスト修正
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
|
-
でマッチさせたときの
|
28
|
+
でマッチさせたときの各キャプチャ `(・・・)`で取得できます。。これを使って、入力されたテキスト `text` に含まれる、台詞中の単語すべてを、各単語の文字数と同じ数の`_`で構成される文字列で置き換える関数
|
39
29
|
`maskingWordsInSpeech(text)`
|
40
30
|
を作ります。以下はその一例です。
|
41
31
|
|
@@ -53,7 +43,7 @@
|
|
53
43
|
};
|
54
44
|
```
|
55
45
|
|
56
|
-
|
46
|
+
上記の`maskingWordsInSpeech(text)` を動作確認するためのサンプルを以下に作成しました。
|
57
47
|
|
58
48
|
- [https://jsfiddle.net/jun68ykt/Lp7y40t3/9/](https://jsfiddle.net/jun68ykt/Lp7y40t3/9/)
|
59
49
|
|
2
テキスト修正
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
|
-
|
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
テキスト修正
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/)
|