Вы хотите сопоставить пустую строку и заменить на "*"
. Итак, что-то вроде этого работает:
System.out.println("string".replaceAll("", "*"));
// "*s*t*r*i*n*g*"
Или еще лучше, поскольку пустая строка может быть сопоставлена буквально без регулярных выражений, вы можете просто сделать:
System.out.println("string".replace("", "*"));
// "*s*t*r*i*n*g*"
Почему это работает
Это потому, что любой экземпляр строки startsWith("")
, endsWith("")
и contains("").
Между любыми двумя символами в любой строке есть пустая строка. На самом деле в этих местах бесконечное количество пустых строк.
(И да, это верно для самой пустой строки. Это «пустая» строка contains
сама!).
Механизм регулярных выражений и String.replace
автоматически увеличивают индекс при поиске следующего соответствия в подобных случаях, чтобы предотвратить бесконечный цикл.
«Реальное» решение регулярных выражений
В этом нет необходимости, но это показано здесь для образовательных целей: что-то вроде этого также работает:
System.out.println("string".replaceAll(".?", "*$0"));
// "*s*t*r*i*n*g*"
Это работает путем сопоставления «любого» символа с .
и замены его на *
и этого символа путем обратной ссылки на группу 0.
Чтобы добавить звездочку для последнего символа, мы разрешаем .
опционально сопоставляться с .?
. Это работает, потому что ?
является жадным и всегда будет принимать символ, если это возможно, т.е. где угодно, кроме последнего символа.
Если строка может содержать символы новой строки, используйте режим Pattern.DOTALL/(?s)
.
Ссылки