我需要转换一个字符串

"string"


"*s*t*r*i*n*g*"

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

最佳答案

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

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) 模式。

引用
  • regular-expressions.info/Dot Matches (Almost) Any CharacterGrouping and Backreferences
  • 关于java - 如何将 "string"转换为 "*s*t*r*i*n*g*",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3282956/

    10-10 18:31
    查看更多