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

时间:2010-07-19 16:29:33

标签: java regex replace string

我需要转换像

这样的字符串
"string"

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

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

4 个答案:

答案 0 :(得分:23)

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

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

参考

答案 1 :(得分:5)

我认为""是您想要的正则表达式。

System.out.println("string".replaceAll("", "*"));

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

答案 2 :(得分:3)

如果这就是你所做的一切,我就不会使用正则表达式:

public static String glitzItUp(String text) {
    return insertPeriodically(text, "*", 1);
}

Putting char into a java string for each N characters

public static String insertPeriodically(
    String text, String insert, int period) 
{
    StringBuilder builder = new StringBuilder(
        text.length() + insert.length() * (text.length()/period)+1);

    int index = 0;
    while (index <= text.length())
    {
        builder.append(insert);
        builder.append(text.substring(index,
            Math.min(index + period, text.length())));
        index += period;
    }
    return builder.toString();
}

另一个好处(简单除外)是ten times faster而不是正则表达式。

IDEOne | Working example

答案 3 :(得分:0)

只是成为一个混蛋,我打算用J:

我花了一个学年学习Java,并在夏天自学了一点J,如果你要为自己做这个,那么使用J可能是最有成效的因为整个插入一个星号的东西很容易用一个简单的动词定义来完成。

asterisked =: 3 : 0 
 i =. 0
 running_String =. '*'
 while. i < #y do. 
    NB. #y returns tally, or number of items in y: right operand to the verb
    running_String =. running_String, (i{y) , '*'
    i =. >: i
 end.
 ]running_String
)

这就是为什么我会使用J:我知道如何做到这一点,并且只研究了几个月的语言。这并不像整个.replaceAll()方法那样简洁,但您可以很容易地自己完成,并在以后编辑它。随意删除这个/巨魔这个/在我对J的建议中发炎,我真的不在乎:我不是在宣传它。