如何用不同的值替换相同的字符?

时间:2015-01-20 10:07:35

标签: java string loops replace

我在使用索引替换字符串中的字符时遇到问题。

例如,我想更换每一个'?'索引字符串:

"a?ghmars?bh?" - >将是"a1ghmars8bh11"

真的很感激任何帮助。 P.s我今天需要解决这个任务,所以我可以把它传给我的导师。 谢谢你。

到目前为止,我要管理用?替换0;通过这段代码:

public static void main(String[] args) {

    String name = "?tsds?dsds?";

    String myarray[] = name.split("");
    for (int i = 0; i < myarray.length; i++) {

        name = name.replace("?", String.valueOf(i++));

    }
    System.out.println(name);

输出:

0tsds0dsds0

它应该是:

0tsds5dsds10

5 个答案:

答案 0 :(得分:1)

对于简单的替换操作,String.replaceAll就足够了。对于更复杂的操作,您必须部分回溯,这种方法的作用。

documentation of String.replaceAll表示它等同于

Pattern.compile(regex).matcher(str).replaceAll(repl)

而链接的documentation of replaceAll包含对方法appendReplacement的引用,该方法由Java的正则表达式包public提供,完全用于支持自定义替换操作。 It’s documentation还提供了普通replaceAll操作的代码示例:

Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());

使用此模板,我们可以按如下方式实现所需的操作:

String name = "?tsds?dsds?";

Matcher m=Pattern.compile("?", Pattern.LITERAL).matcher(name);
StringBuffer sb=new StringBuffer();
while(m.find()) {
    m.appendReplacement(sb, String.valueOf(m.start()));
}
m.appendTail(sb);
name=sb.toString();

System.out.println(name);

不同之处在于我们使用LITERAL模式来抑制正则表达式中?的特殊含义(比使用"\\?"作为模式更容易阅读)。此外,我们指定找到的匹配位置的String表示作为替换(这是您的问题的全部内容)。就是这样。

答案 1 :(得分:0)

在之前的回答错误的阅读问题,对不起。这段代码取代了每个“?”及其索引

String string = "a?ghmars?bh?das?";
while ( string.contains( "?" ) )
{
    Integer index = string.indexOf( "?" );
    string = string.replaceFirst( "\\?", index.toString() );
    System.out.println( string );
}

所以来自“a?ghmars?bh?das?”我们得到了“a1ghmars8bh11das16”

答案 2 :(得分:0)

我认为这可能有用,我没有检查过。

public class Stack{
public static void main(String[] args) {
String name = "?tsds?dsds?";
int newvalue=50;
int countspecialcharacter=0;
for(int i=0;i<name.length();i++)
{
    char a=name.charAt(i);
    switch(a)
    {
        case'?':
        countspecialcharacter++;
        if(countspecialcharacter>1)
        {
            newvalue=newvalue+50;
        System.out.print(newvalue);
        }
        else
        {
                System.out.print(i);
        }
        break;
        default:
                System.out.print(a);
        break;
    }
}

} }

答案 3 :(得分:0)

  

检查以下代码

 String string = "a?ghmars?bh?das?";

    for (int i = 0; i < string.length(); i++) {

        Character r=string.charAt(i);

        if(r.toString().equals("?"))
           System.out.print(i);
        else
           System.out.print(r);

     }

答案 4 :(得分:0)

您(或多或少)用事件的基数替换每个目标(1表示1,2表示2,等等),但您需要索引

使用StringBuilder - 您只需要几行:

StringBuilder sb = new StringBuilder(name);
for (int i = name.length - 1; i <= 0; i--)
    if (name.charAt(i) == '?')
        sb.replace(i, i + 1, i + "");

注意倒计时,而不是向上,允许替换索引为多位数,如果你计算在内会改变后续调用的索引(例如,当索引“?”时,所有内容都会被一个字符改组。 “是10或更多。”