如何从字符串中替换每个第n个字符x

时间:2018-05-14 14:07:55

标签: java string csv replace

我的问题是如何取代每一个第三个&#39 ;;'从一个字符串a put a','在这个位置?

例如:

String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53"

使字符串看起来像:

RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53

我试图像这样解决它,但我不能用charAt(i)将其替换为其他字符。

int counter =0;
for (int i=0;i<s.length();i++){
    if(s.charAt(i) == ';'){

    counter++;
    }
    if(counter ==3){
    s.charAt(i)=',';
    counter =0;
    }


}

4 个答案:

答案 0 :(得分:4)

正常情况下,问题需要一些自己的努力,但正则表达式很难。

s = s.replaceAll("([^;]*;[^;]*;[^;]*);", "$1,");

0分钟或更多分号的序列,后跟分号等。

[^ ...characters... ]列出了

...*是前一场比赛的零或更多。

第一组(...)的匹配在$1中给出,因此实际上只有最后一个分号被逗号替换。

答案 1 :(得分:2)

不像@Joop那样优雅,但可能更容易理解:

String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
char[] chars = s.toCharArray();
int counter = 1;
for (int i = 0; i < chars.length; i++){
   if (chars[i] == ';'){
      if (counter == 3){
         chars[i] = ','; // replace ';' with ','
         counter = 1;    // set counter to 1
      }else {
         counter++;
      }
   }
}
String output = String.valueOf(chars);
System.out.println(output); // RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53

答案 2 :(得分:2)

您可以使用modulo%运算符来了解第三次发生的事情。并在字符串和char数组之间进行简单的转换以完成剩下的工作:

class Main {

    public static void main(String[] args) {    
        String s1 = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
        char [] s = s1.toCharArray();
        int j=0;
        for(int i=0;i<s.length;i++){    
        if (s[i]==';') {
           j++;    
           if(j % 3 == 0) {    
             s[i] = ',';    
          }     
       }
     }
    System.out.println(s);
  }
}

答案 3 :(得分:2)

正如我在comment中所建议的,有很多方法可以做到这一点。以下是我建议的实现,但当然有更多的方法。

从代码的角度来看,第一个是最简单的,如果你知道正则表达式。有关说明,请参阅answer by Joop Eggen

第二个可能是最快的,特别是如果您通过将%重置为0来消除j模运算符。

private static String usingRegex(String s) {
    return s.replaceAll("([^;]*;[^;]*;[^;]*);", "$1,");
}

private static String usingCharArray(String s) {
    char[] arr = s.toCharArray();
    for (int i = 0, j = 0; i < arr.length; i++)
        if (arr[i] == ';' && ++j % 3 == 0)
            arr[i] = ',';
    return new String(arr);
}

private static String usingStringBuilder(String s) {
    StringBuilder sb = new StringBuilder(s);
    for (int i = 0, j = 0; i < sb.length(); i++)
        if (sb.charAt(i) == ';' && ++j % 3 == 0)
            sb.setCharAt(i, ',');
    return sb.toString();
}

private static String usingSubstring(String s) {
    int i = -1, j = 0;
    while ((i = s.indexOf(';', i + 1)) != -1)
        if (++j % 3 == 0)
            s = s.substring(0, i) + ',' + s.substring(i + 1);
    return s;
}

测试

String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
System.out.println(usingRegex(s));
System.out.println(usingCharArray(s));
System.out.println(usingStringBuilder(s));
System.out.println(usingSubstring(s));

输出

RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53