我正在尝试找出替换字符串的第n个字符的最佳方法,但是在循环时忽略空格。例如,如果我要将字符串mary had a little lamb
的每第5个字符更改为z
,则应返回mary zad azlittze lazb
我认为的一种方法是删除所有空格(maryhadalittlelamb
),然后将所有第5个字符更改为z
(maryzadazlittzelazb
),然后引用原始字符串,找到索引" "
并将其插入maryzadazlittzelazb
但是,这似乎不是很优雅,我敢肯定还有更好的方法,有人可以建议吗?
谢谢!
答案 0 :(得分:2)
我将使用String.toCharArray()
,然后使用常规的for
循环进行迭代,并使用Character.isWhitespace(char)
测试每个字符是否不是空格。如果不是,请增加第二个计数器(在这里称为p
),并检查该值是否可被5整除。如果是这样,请将其设置为z
。最后,根据编辑后的String
创建一个新的char[]
。喜欢,
String str = "mary had a little lamb";
char[] arr = str.toCharArray();
for (int i = 0, p = 0; i < arr.length; i++) {
if (!Character.isWhitespace(arr[i]) && ++p % 5 == 0) {
arr[i] = 'z';
}
}
System.out.println(new String(arr));
我得到了(正如我在评论中提到的)
mary zad a lzttle zamb
此外,由于可能不太清楚,因此上面的复杂if
等同于
if (!Character.isWhitespace(arr[i])) {
p++;
if (p % 5 == 0) {
arr[i] = 'z';
}
}
答案 1 :(得分:1)
为完整起见,我的建议应如下所示:
public static void main(String... args) {
Pattern p = Pattern.compile("((\\S\\s*){4})\\S");
Matcher m = p.matcher("mary had a little lamb");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "$1z");
}
m.appendTail(sb);
System.out.println(sb.toString());
}