我的问题是我只想替换一个特定字符或字符串的一部分,而不替换同一字符的其余部分
我的例子
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);
它输出:/// /// ///
而不是:####/####
感谢您的帮助!
答案 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组#...,然后是#。
虽然慢,但很短。