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

回答編集履歴

2

質問文変更により、新しい部分の回答を追記

2019/02/07 04:52

投稿

dice142
dice142

スコア5158

answer CHANGED
@@ -34,4 +34,25 @@
34
34
  ・`(`であれば`)`の位置を`indexOf`で取得し、`(...)`の文字列を`slice`で取得します
35
35
  ・`(`でなければその部分の文字だけを取得します
36
36
 
37
- 一例ですが、こんな感じで取れるかと思います。
37
+ 一例ですが、こんな感じで取れるかと思います。
38
+
39
+ ---
40
+
41
+ ### unParentheses関数について
42
+
43
+ この関数内でやりたいことが
44
+ - 受け取った文字列が`(`で始まっていれば、対応する`)`を探し、その`(`と`)`を削除して返す
45
+ - 受け取った文字列が`(`で始まっていなければ、受け取った文字列をそのまま返す
46
+
47
+ とのことなので、対応する`)`を探すのに必要な手順を書いておきます。
48
+
49
+ 1. 受け取った文字列の0文字目から順に調べる
50
+ 1. i文字目が`(`であればカウンタを+1、`)`であればカウンタを-1する
51
+ 1. カウンタが0になった地点の`)`が`(`に対応する`)`であるので、その位置を記録してループを抜ける。
52
+ 1. 0文字目を削除する(1文字目以降を詰める)
53
+ 1. 記録した`)`の位置を削除する(それより後ろを詰める)
54
+ 1. `(`と`)`を削除した文字列を返す
55
+
56
+ `(`と`)`を削除する処理はsliceを使ったほうが楽です。
57
+ また、受け取る文字列に制約があれば(括弧の入れ子がないとか)もっとシンプルな方法があるはずです。
58
+ (制約によりますが。)

1

ブロックの抽出について追記

2019/02/07 04:52

投稿

dice142
dice142

スコア5158

answer CHANGED
@@ -18,4 +18,20 @@
18
18
  ---
19
19
 
20
20
  b, cは変数と仰っているので、もしかしたら文字列を切り分ける処理はメインで行うかもしれません。
21
- やりたいことを処理順に書き直し、少しずつプログラムに起こしてみてください。
21
+ やりたいことを処理順に書き直し、少しずつプログラムに起こしてみてください。
22
+
23
+ ---
24
+
25
+ ### ブロックの抽出方法について
26
+
27
+ sliceを使って行うとのことなので、`A(bc)(de)`のような単純な場合の考え方を書いておきます。
28
+
29
+ 1. ブロック1の開始(2文字目)が`(`かどうか調べます
30
+ ・`(`であれば`)`の位置を`indexOf`で取得し、`(...)`の文字列を`slice`で取得します
31
+ ・`(`でなければそのまま2文字目だけを取得します
32
+
33
+ 1. ブロック1の最後の文字(`)`or2文字目)の次の文字が`(`か調べます
34
+ ・`(`であれば`)`の位置を`indexOf`で取得し、`(...)`の文字列を`slice`で取得します
35
+ ・`(`でなければその部分の文字だけを取得します
36
+
37
+ 一例ですが、こんな感じで取れるかと思います。