回答編集履歴

4

コード細分化

2021/12/22 12:03

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -54,29 +54,11 @@
54
54
 
55
55
  private static String expansion(String str) {
56
56
 
57
- while(true){
57
+ for(Matcher m; (m=REPEAT_PATTERN.matcher(str)).find(); ) {
58
58
 
59
- Matcher m = REPEAT_PATTERN.matcher(str);
59
+ str = reconstruction(str, m.start(), m.end(),
60
60
 
61
- if(!m.find()) break;
62
-
63
-
64
-
65
- int count = Integer.parseInt(m.group(1));
66
-
67
- String substr = m.group(2) != null ? m.group(2) : m.group(3);
61
+ Integer.parseInt(m.group(1)), m.group(2)!=null?m.group(2):m.group(3));
68
-
69
-
70
-
71
- StringBuilder sb = new StringBuilder(str.substring(0, m.start()));
72
-
73
- for(int i=0; i<count; i++) sb.append(substr);
74
-
75
- sb.append(str.substring(m.end()));
76
-
77
-
78
-
79
- str = sb.toString();
80
62
 
81
63
  }
82
64
 
@@ -84,6 +66,34 @@
84
66
 
85
67
  }
86
68
 
69
+ /**
70
+
71
+ * src の start から end-1 の間を "repeatString を repeatCount 回繰り返した文字列" に置き換えた文字列を返す
72
+
73
+ * @param src 元の文字列
74
+
75
+ * @param start 置き換え開始位置
76
+
77
+ * @param end 置き換え終了位置+1
78
+
79
+ * @param repeatCount 繰り返し回数
80
+
81
+ * @param repeatString 繰り返し文字列
82
+
83
+ * @return 置き換えた文字列
84
+
85
+ */
86
+
87
+ private static String reconstruction(String src, int start, int end, int repeatCount, String repeatString) {
88
+
89
+ StringBuilder sb = new StringBuilder(src.substring(0, start));
90
+
91
+ for(int i=0; i<repeatCount; i++) sb.append(repeatString);
92
+
93
+ return sb.append(src.substring(end)).toString();
94
+
95
+ }
96
+
87
97
  }
88
98
 
89
99
  ```

3

修正

2021/12/22 12:03

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  パターンに一致した際の情報は Matcher 内に多数含まれています。
4
4
 
5
- 例えば、パターンで () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
5
+ 例えば、パターンで () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置(の次)は start(), end() で取得できます。
6
6
 
7
7
  ```java
8
8
 

2

追加

2021/12/22 11:31

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  パターンに一致した際の情報は Matcher 内に多数含まれています。
4
4
 
5
- 例えば、 () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
5
+ 例えば、パターンで () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
6
6
 
7
7
  ```java
8
8
 

1

説明追加等

2021/12/22 11:25

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -1,6 +1,8 @@
1
1
  それほどのコードは必要ありません。
2
2
 
3
+ パターンに一致した際の情報は Matcher 内に多数含まれています。
3
4
 
5
+ 例えば、 () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
4
6
 
5
7
  ```java
6
8
 
@@ -46,11 +48,11 @@
46
48
 
47
49
 
48
50
 
49
- private static Pattern REPEAT_PATTERN = Pattern.compile("([1-9][0-9]*)(?:([a-zA-Z])|\(([a-zA-Z]+)\))");
51
+ private static final Pattern REPEAT_PATTERN = Pattern.compile("([1-9][0-9]*)(?:([a-zA-Z])|\(([a-zA-Z]+)\))");
50
52
 
51
53
 
52
54
 
53
- public static String expansion(String str) {
55
+ private static String expansion(String str) {
54
56
 
55
57
  while(true){
56
58