使用replace方法仅替换一个字符或字符串

时间:2019-03-02 03:05:44

标签: java string replace

我的问题是我只想替换一个特定字符或字符串的一部分,而不替换同一字符的其余部分

我的例子

char one = '#';
char two = '#';
char three = '#';
char four = '#';
char five = '#';
char six = '#';
char seven = '#';
char eight = '#';
char nine = '#';

String chart = "\n"+ one + two + three + "\n" + four + five + six + "\n"+ seven 
     + eight + nine + "\n\n";

chart = chart.replace(five, '/');
System.out.print(chart);

它输出:/// /// ///

而不是:####/####

感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

从您的字符串中创建一个 StringBuilder 对象,并使用 charAt 方法。

https://www.tutorialspoint.com/java/lang/stringbuilder_charat.htm

然后致电toString

int replacePosition = 5;//Choose it.
String inputStr = getYourString();
StringBuilder sb = new StringBuilder(inputStr);
sb.chrAt(replacePosition);
String result = sb.toString();

如果您有一个String,并且只想替换至少重复n次的单个字符并替换其第n次出现(在您的示例中为5),那么您需要查找首先确定其位置,然后使用 StringBuilder.charAt()应用解决方案。

要查找角色的索引,您可以简单地遍历宪章,或使用方法 indexOf() https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int,%20int)

如果先前的indexOf为正,则每次

n次具有从上一次呼叫开始的新起始位置。

答案 1 :(得分:0)

Java replace method具有2个参数-您要替换的字符和您要替换的字符。
由于所有字符都相同,因此您不想使用replace方法,而要使用substring方法。 Here is the documentation for it.

答案 2 :(得分:0)

这应该有效:

MatchResult findNthOccurance(int n, Pattern p, CharSequence src){
    Matcher m = p.matcher(src);
    for(int i = 0; i<n; i++) m.find();
    return m;
}

基本上,它只是重复地调用从Pattern获得的Matcher上的find。方便地,匹配器也是MatchResult,所以我可以直接将其返回。

答案 3 :(得分:0)

position变量中存储您要替换的出现次数。如您所要替换的5th,现在将其存储为5。

    Pattern p = Pattern.compile("#");
    Matcher m = p.matcher(chart);
    int count = 0;
    int position = 5;
    int index = 0;
    while (m.find()) {
        count++;
        if (count == position - 1) {
            index = m.end();
        }
    }
    String regex = "([#\n]{" + index + "})(#)([#\\n]{1,})";
    chart = chart.replaceAll(regex, "$1/$3");
    System.out.println(chart);

我在这里首先要找到第n-1个出现的字符并将其存储在 index 中。然后在 replaceAll 中我有一个正则表达式将字符串分为三部分,一个在要替换的字符之前,下一个仅包含第n个出现的一个字符,最后一个包含剩余的字符。 $1/$3表示将整个字符串替换为 group1 ,后跟 / group3

答案 4 :(得分:0)

s = s.replaceFirst("((#[^#]*){5})#", "$1/") ;

这用/代替了第6 个(第一次)出现,实际上是搜索5组#...,然后是#。

虽然慢,但很短。