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

Java 使用replace方法仅替换一个字符或字符串,java,string,replace,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" + fou

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

我的例子

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);
它输出://////

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

感谢您的帮助

接受两个参数-要替换的字符和要替换的字符。
由于所有字符都相同,因此不希望使用
replace
方法,而是使用
substring
方法

接受两个参数-要替换的字符和要替换的字符。

由于所有字符都相同,因此不希望使用
replace
方法,而是使用
substring
方法

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

然后调用
toString

int replacePosition = 5;//Choose it.
String inputStr = getYourString();
StringBuilder sb = new StringBuilder(inputStr);
sb.chrAt(replacePosition);
String result = sb.toString();
如果您有一个字符串,并且只想替换其重复至少
n次的单个字符,并替换其第n次出现(在您的示例中为5次),则需要首先找到其位置,然后使用StringBuilder.charAt()应用解决方案

要查找角色的索引,您可以简单地循环使用charters,或者使用方法indexOf()


n
如果上一个indexOf为正值,则每次使用上一次调用中的新起始位置执行次。

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

然后调用
toString

int replacePosition = 5;//Choose it.
String inputStr = getYourString();
StringBuilder sb = new StringBuilder(inputStr);
sb.chrAt(replacePosition);
String result = sb.toString();
如果您有一个字符串,并且只想替换其重复至少
n次的单个字符,并替换其第n次出现(在您的示例中为5次),则需要首先找到其位置,然后使用StringBuilder.charAt()应用解决方案

要查找角色的索引,您可以简单地循环使用charters,或者使用方法indexOf()

n
如果上一个indexOf为正值,则每次使用上一次调用的新起始位置执行次数。

这应该可以:

MatchResult findNthOccurance(int n, Pattern p, CharSequence src){
    Matcher m = p.matcher(src);
    for(int i = 0; i<n; i++) m.find();
    return m;
}
MatchResult findNthOccurance(int n,Pattern p,CharSequence src){
匹配器m=p.Matcher(src);
对于(int i=0;i这应该可以:

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

对于(int i=0;iIn
position
变量,存储要替换的事件数。与您的情况一样,您尝试替换第5个,因此现在将其存储为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次出现的字符的结尾,并将其存储在索引中。然后在replaceAll中,我有一个正则表达式,它将字符串分为三部分,一部分在要替换的字符之前,另一部分只包含第n次出现的一个字符,最后一部分包含remaining.
$1/$3
意味着将整个字符串替换为group1,然后是/,然后是group3,在
位置
变量中存储要替换的发生次数。在您的例子中,您试图替换第5次,因此现在将其存储为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);
s = s.replaceFirst("((#[^#]*){5})#", "$1/") ;
我在这里做的是,首先我会找到第n-1次出现的字符的结尾,并将其存储在索引中。然后在replaceAll中,我有一个正则表达式,它将字符串分为三部分,一部分在要替换的字符之前,另一部分只包含第n次出现的一个字符,最后一部分包含remaining.
$1/$3
表示将整个字符串替换为group1,然后替换为/,再替换为group3

s = s.replaceFirst("((#[^#]*){5})#", "$1/") ;
这将用/(第一次)替换第六次出现的#,实际搜索5组#…,然后是#

虽然慢但短

这将用/(第一次)替换第六次出现的#,实际搜索5组#…,然后是#

虽然慢但短