回答編集履歴
4
コード細分化
    
        answer	
    CHANGED
    
    | 
         @@ -26,20 +26,25 @@ 
     | 
|
| 
       26 
26 
     | 
    
         
             
              private static final Pattern REPEAT_PATTERN = Pattern.compile("([1-9][0-9]*)(?:([a-zA-Z])|\(([a-zA-Z]+)\))");
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
              private static String expansion(String str) {
         
     | 
| 
       29 
     | 
    
         
            -
                while(true){
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 29 
     | 
    
         
            +
                for(Matcher m; (m=REPEAT_PATTERN.matcher(str)).find(); ) {
         
     | 
| 
       31 
     | 
    
         
            -
                  if(!m.find()) break;
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                   
     | 
| 
      
 30 
     | 
    
         
            +
                  str = reconstruction(str, m.start(), m.end(),
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
                      Integer.parseInt(m.group(1)), m.group(2)!=null?m.group(2):m.group(3));
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                  StringBuilder sb = new StringBuilder(str.substring(0, m.start()));
         
     | 
| 
       37 
     | 
    
         
            -
                  for(int i=0; i<count; i++) sb.append(substr);
         
     | 
| 
       38 
     | 
    
         
            -
                  sb.append(str.substring(m.end()));
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                  str = sb.toString();
         
     | 
| 
       41 
32 
     | 
    
         
             
                }
         
     | 
| 
       42 
33 
     | 
    
         
             
                return str;
         
     | 
| 
       43 
34 
     | 
    
         
             
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
              /**
         
     | 
| 
      
 36 
     | 
    
         
            +
               * src の start から end-1 の間を "repeatString を repeatCount 回繰り返した文字列" に置き換えた文字列を返す
         
     | 
| 
      
 37 
     | 
    
         
            +
               * @param src 元の文字列
         
     | 
| 
      
 38 
     | 
    
         
            +
               * @param start 置き換え開始位置
         
     | 
| 
      
 39 
     | 
    
         
            +
               * @param end 置き換え終了位置+1
         
     | 
| 
      
 40 
     | 
    
         
            +
               * @param repeatCount 繰り返し回数
         
     | 
| 
      
 41 
     | 
    
         
            +
               * @param repeatString 繰り返し文字列
         
     | 
| 
      
 42 
     | 
    
         
            +
               * @return 置き換えた文字列
         
     | 
| 
      
 43 
     | 
    
         
            +
               */
         
     | 
| 
      
 44 
     | 
    
         
            +
              private static String reconstruction(String src, int start, int end, int repeatCount, String repeatString) {
         
     | 
| 
      
 45 
     | 
    
         
            +
                StringBuilder sb = new StringBuilder(src.substring(0, start));
         
     | 
| 
      
 46 
     | 
    
         
            +
                for(int i=0; i<repeatCount; i++) sb.append(repeatString);
         
     | 
| 
      
 47 
     | 
    
         
            +
                return sb.append(src.substring(end)).toString();
         
     | 
| 
      
 48 
     | 
    
         
            +
              }
         
     | 
| 
       44 
49 
     | 
    
         
             
            }
         
     | 
| 
       45 
50 
     | 
    
         
             
            ```
         
     | 
3
修正
    
        answer	
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            それほどのコードは必要ありません。
         
     | 
| 
       2 
2 
     | 
    
         
             
            パターンに一致した際の情報は Matcher 内に多数含まれています。
         
     | 
| 
       3 
     | 
    
         
            -
            例えば、パターンで () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
         
     | 
| 
      
 3 
     | 
    
         
            +
            例えば、パターンで () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置(の次)は start(), end() で取得できます。
         
     | 
| 
       4 
4 
     | 
    
         
             
            ```java
         
     | 
| 
       5 
5 
     | 
    
         
             
            package teratail_java.q375087;
         
     | 
| 
       6 
6 
     | 
    
         | 
2
追加
    
        answer	
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            それほどのコードは必要ありません。
         
     | 
| 
       2 
2 
     | 
    
         
             
            パターンに一致した際の情報は Matcher 内に多数含まれています。
         
     | 
| 
       3 
     | 
    
         
            -
            例えば、 () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
         
     | 
| 
      
 3 
     | 
    
         
            +
            例えば、パターンで () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
         
     | 
| 
       4 
4 
     | 
    
         
             
            ```java
         
     | 
| 
       5 
5 
     | 
    
         
             
            package teratail_java.q375087;
         
     | 
| 
       6 
6 
     | 
    
         | 
1
説明追加等
    
        answer	
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            それほどのコードは必要ありません。
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            パターンに一致した際の情報は Matcher 内に多数含まれています。
         
     | 
| 
      
 3 
     | 
    
         
            +
            例えば、 () で囲まれた部分で一致した文字列は group(int) で取得できますし、一致した最初の位置、最後の位置は start(), end() で取得できます。
         
     | 
| 
       3 
4 
     | 
    
         
             
            ```java
         
     | 
| 
       4 
5 
     | 
    
         
             
            package teratail_java.q375087;
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
         @@ -22,9 +23,9 @@ 
     | 
|
| 
       22 
23 
     | 
    
         
             
                }
         
     | 
| 
       23 
24 
     | 
    
         
             
              }
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
              private static Pattern REPEAT_PATTERN = Pattern.compile("([1-9][0-9]*)(?:([a-zA-Z])|\(([a-zA-Z]+)\))");
         
     | 
| 
      
 26 
     | 
    
         
            +
              private static final Pattern REPEAT_PATTERN = Pattern.compile("([1-9][0-9]*)(?:([a-zA-Z])|\(([a-zA-Z]+)\))");
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
               
     | 
| 
      
 28 
     | 
    
         
            +
              private static String expansion(String str) {
         
     | 
| 
       28 
29 
     | 
    
         
             
                while(true){
         
     | 
| 
       29 
30 
     | 
    
         
             
                  Matcher m = REPEAT_PATTERN.matcher(str);
         
     | 
| 
       30 
31 
     | 
    
         
             
                  if(!m.find()) break;
         
     |