Вот еще один вариант, который, на мой взгляд, проще и более читабелен:
str.replaceAll ("(\\D|\\b)\\d{8}(\\d{2}(\\D|\\b))", "$1XXXXXXXX$2");
Ищите в начале строки либо не цифру, либо границу слова (в данном случае просто начало и конец строки)и конец шаблона, а затем 8 цифр + 2 цифры между ними.
Сохраните все, что соответствует, кроме 8 цифр, и вставьте снова с обратными ссылками.
Я не уверен, как он соотносится с ответом @Andreas, хотя с точки зрения производительности.
С вашим вводом это можно упростить до следующего:
y = x.replaceAll ("(\\D)\\d{8}(\\d{2}(\\D|\\b))", "$1XXXXXXXX$2");