如何将"string"转换为"*s*t*r*i*n*g*"

Dee*_*epL 4 java regex string replace

我需要转换一个字符串

"string"
Run Code Online (Sandbox Code Playgroud)

"*s*t*r*i*n*g*"
Run Code Online (Sandbox Code Playgroud)

什么是正则表达式?语言是Java.

pol*_*nts 23

您想匹配一个空字符串,并替换为"*".所以,像这样的工作:

System.out.println("string".replaceAll("", "*"));
// "*s*t*r*i*n*g*"
Run Code Online (Sandbox Code Playgroud)

或者更好的是,由于空字符串可以在没有正则表达式的情况下按字面匹配,您可以这样做:

System.out.println("string".replace("", "*"));
// "*s*t*r*i*n*g*"
Run Code Online (Sandbox Code Playgroud)

为什么会这样

这是因为一个字符串的任何实例startsWith(""),并且endsWith(""),和contains("").任何字符串中的任何两个字符之间,有一个空字符串.事实上,这些位置有无数个空字符串.

(是的,对于空字符串本身也是如此.这本身就是一个"空"字符串contains!).

String.replace当在这些情况下寻找下一个匹配时,正则表达式引擎会自动推进索引以防止无限循环.


一个"真正的"正则表达式解决方案

没有必要这样做,但这里显示的是出于教育目的:这样的东西也有效:

System.out.println("string".replaceAll(".?", "*$0"));
// "*s*t*r*i*n*g*"
Run Code Online (Sandbox Code Playgroud)

这通过将"任何"字符与后面的组0 匹配.,并将其替换*为该字符来实现.

要为最后一个字符添加星号,我们允许.可选地匹配.?.这样做是因为?贪婪并且如果可能的话总是会占用一个角色,即除了最后一个角色之外的任何地方.

如果字符串可能包含换行符,则使用Pattern.DOTALL/(?s)mode.

参考


Sea*_*ean 5

我认为""是你想要的正则表达式.

System.out.println("string".replaceAll("", "*"));
Run Code Online (Sandbox Code Playgroud)

这打印*s*t*r*i*n*g*.

  • 实际上,`String.replace(CharSequence,CharSequence)使用`Pattern`来进行替换.所以,实际上,它是正则表达式:p (3认同)