Q:

Нужно заменить середину строки на число длины самой строки

Не могу понять в чем проблема. Имею строку 

This string has (len) characters.

Нужно (len) заменить на длину самой строки. В данном случае это 33.
Пишу код, но в итоге получается:

This string has (33) characters.

Остаются круглые скобки. Не могу понять что делаю не так. Вот код:
import java.util.*;

public class Main {

   public static void main(String[] args) {

       // Open the input stream.
       Scanner sc = new Scanner(System.in); 

       // Put your code here. 
       // For sample (Read the line)
       String s = sc.nextLine();
       String d = String.valueOf(s.length());
       int pos1 = s.indexOf("(");
       int pos2 = s.indexOf(")");
       String b = s.substring (pos1,pos2+1);
       String c = s.replaceAll(b, d);
       System.out.println(c);
   }
}

A:

Попробуйте взглянуть на решение своей задачи немного иначе. Воспользуемся регулярным выражением.
   String s = "This string has (len) characters.";
   String d = String.valueOf(s.length());

   String string = s.replaceAll("[(][a-zA-Z]*[)]", d);
   System.out.println(string);

На выходе
This string has 33 characters.

Опять же значение длины будет неправильным, потому что измеряем
"This string has (len) characters."

и длина (len) не равна длине 33
Можно сделать так
   String s = "This string has (len) characters.";
//измерим длину входной строки без заменяемой части
   int lengthWithout = s.replaceAll("[(][a-zA-Z]*[)]", "").length();
//сложим длину без заменяемой части с длиной вставки
   String string = s.replaceAll("[(][a-zA-Z]*[)]", String.valueOf(lengthWithout + String.valueOf(lengthWithout).length()));

   System.out.println(string); 

На выходе будет реальное значение
This string has 30 characters.

