String source = " 1234567890123456 t 1234 5678 9012 3456"; String result1, result2; // Variant 1 Pattern p1 = Pattern.compile("([\\d\\s]{4,})([\\s]{0,})([\\d]{2})(?:[\\d]{2})([\\s]{0,})(?:[\\d]{4})([\\s]{0,})([\\d\\s]{4})"); result1 = p1.matcher(source).replaceAll("$1$2$3**$4****$5$6"); // Variant 2 Pattern p2 = Pattern.compile("[\\d\\s]{12,20}"); Matcher m = p2.matcher(source); result2 = source; while (m.find()) result2 = result2.substring(0, m.start() + 12) + result2.substring(m.start() + 12, m.end() - 11).replaceAll("\\d", "*") + result2.substring(m.end() - 11, result2.length()); System.out.println(source); // 1234567890123456 t 1234 5678 9012 3456 System.out.println(result1); // 123456******3456 t 1234 56** **** 3456 System.out.println(result2); // 123456******3456 t 1234 5*** **** 3456