如何用不同的值替换相同的字符?
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 public
ly 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 个或更多)。
我在用索引替换字符串中的字符时遇到问题。
例如我想替换每个'?'其索引字符串:
"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 public
ly 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 个或更多)。