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

How to replace the same character with deferent value?

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

例如我想替换每个'?'其索引字符串:

"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

之前的回答看错了问题,抱歉。此代码替换每个“?”其指数

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"

对于简单的替换操作,String.replaceAll 就足够了。对于更复杂的操作,你必须部分回溯,这个方法做了什么。

documentation of String.replaceAll表示相当于

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

而链接 documentation of replaceAll contains a reference to the method appendReplacement which is provided by Java’s regex package publicly for exactly the purpose of supporting customized replace operations. 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 表示指定为替换(这就是您的问题所在)。就是这样。

我认为这可能有效我还没有检查过。

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;
    }
}

} }

Check below code

 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);

     }

您(或多或少)用出现的基数替换每个目标(1 表示第 1 次,2 表示第 2 次,等等)但您想要 index

使用 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 个或更多)。