如何在String Java中查找和替换3个或更多字符中的3个或更多字符?

时间:2012-11-06 02:39:49

标签: java string replace sequence stringbuilder

我需要检查该行是否包含必须的字符串 消除并指出哪些符号将被消除。
如果有三个或更多具有相同符号的连续字符,则字符序列将被下划线(“”)替换,因此将与序列长度替换。例如,行“,_,@,@,@,@,$,$,,#,#,!”将被转换为“,_,_,_,_,_,_,$,$,_,#,#,!”消除过程后。
我只需要使用String或StringBuilder,Regex等等(仅限Java的基本编码) 也不能使用数组。 提前谢谢。
这就是我的尝试:

public static void main(String[] args) {    
    String linha = "##,$$$$,%%%%,@%@@@,!!!!", validos = "$#%!@";        
        for (int i = 0; i < validos.length(); i++) {
            linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "_");
        }
        System.out.println (linha);
    }
}

这里的问题是用一个“_”代替一个序列,我不知道哪些字符被替换。

4 个答案:

答案 0 :(得分:0)

如果您尝试一次更换三个字符,而您想要三个下划线,那么您就错过了这个:

linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "___");

如果你想用逗号分隔它们:

linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "_,_,_");

答案 1 :(得分:0)

还没有真正实现这一点,但你可以看一下这个:

在Matcher中,有find(int start)start()end()

拥有“3个或更多重复字符”的模式(您可以参考问题中的评论)。

psuedo代码是这样的:

int lastEndingPosition = 0;
StringBuilder sb;

while (matcher can find next group) {
  // add the unmatched part
  sb.append( substring of input string from lastEndingPosition to matcher.start() ); 

  // add the matched part
  sb.append( "-" for matcher.end() - matcher.start() times);
  lastEndingPosition = matcher.end();
}
sb.append( substring of input string from lastEndingPosition to the end);

可能有一些更优雅的方式来做到这一点。这只是一种选择

答案 2 :(得分:0)

当然,你可以通过多种方式做到这一点,这可能是你自己做的一个很好的练习。在这里你有一个基本的实现,只使用基本的循环结构,没有像StringUtils库这样的花哨......注意你之前的循环实现会错过在linha的不同位置重复出现的同一个字符的几次出现。

static int index(String lookInStr, char lookUpChr) {
    return lookInStr.indexOf(new String(new char[] { lookUpChr, lookUpChr, lookUpChr }));
}

public static void main(String[] args) {
    String linha = "####,@@@@@@@@,$$$$,%%%%,@%@@@,!!!!", validos = "$#%!@";
    for (int i = 0; i < validos.length(); i++) {
        char currentSearchChar = validos.charAt(i);
        do {
            int index = index(linha, currentSearchChar);
            if (index >= 0) {
                int count = -1;
                do {
                    count++;
                } while (linha.charAt(count + index) == currentSearchChar && count + index < linha.length() - 1);
                String replacementSeq = "";
                for (int j = 0; j < count; j++) {
                    replacementSeq += "-";
                }
                linha = linha.replaceAll("\\" + validos.charAt(i) + "{" + count + ",}", replacementSeq);
            }
        } while (index(linha, currentSearchChar) >= 0);
    }
    System.out.println(linha);
}

答案 3 :(得分:0)

基本上,这会将字符串拆分为单独的块,然后检查块的长度并返回原始块,或用下划线替换它。

static String convert(String s) {
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        StringBuilder tempSb = new StringBuilder();

        for(; i < s.length(); i++) {
            char d = s.charAt(i);

            if(d != c) {
                i--;
                break;
            } else {
                tempSb.append(d);
            }
        }

        String t = tempSb.toString();
        if(t.length() < 3) {
            sb.append(t);
        } else {
            sb.append(repeat("_", t.length()));
        }
    }

    return sb.toString();
}

public static void main(String[] args) {
    String x = convert("##,$$$$,%%%%,@%@@@,!!!!");
    System.out.println(x); // ##,____,____,@%___,____
}

这是简单的重复方法:

static String repeat(String s, int repeatCount) {
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < repeatCount; i++) {
        sb.append(s);
    }

    return sb.toString();
}