0

我需要检查该行是否包含必须消除的字符串并指出哪些符号将被消除。如果有三个或更多具有相同符号的连续字符,则
字符序列将替换为下划线 (" "),并根据序列长度进行替换。例如,行“ , _, @, @, @, @, $, $, , #, #,!” 将被转换为“ , _, _, _, _, _, _, $, $, _, #, #,!” 经过消除的过程。
我只需要使用 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

4 回答 4

0

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

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

如果您希望它们用逗号分隔:

linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "_,_,_");
于 2012-11-06T03:06:10.880 回答
0

还没有真正实现这一点,但这是您可能会看到的:

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

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

伪代码是这样的:

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);

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

于 2012-11-06T04:07:59.667 回答
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);
}
于 2012-11-06T04:18:23.740 回答
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();
}
于 2012-11-06T04:41:07.313 回答