Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java字符串中查找3个或更多字符并将其替换为3个或更多字符?_Java_String_Replace_Sequence_Stringbuilder - Fatal编程技术网

如何在Java字符串中查找3个或更多字符并将其替换为3个或更多字符?

如何在Java字符串中查找3个或更多字符并将其替换为3个或更多字符?,java,string,replace,sequence,stringbuilder,Java,String,Replace,Sequence,Stringbuilder,我需要检查该行是否包含必须为 已消除,并指示哪些符号将被消除。 如果有三个或更多具有相同符号的连续字符,则字符序列将替换为下划线(“”),并相应地替换为序列长度。例如,行“,,@,@,@,@,$,#,#,!”在消除过程后将被转换为“,,,,,$,$,,#,!”。 我只需要使用String或StringBuilder、Regex等来执行此操作。。。(仅限于Java的基本编码)。 也不能使用数组。 提前感谢。 这就是我所尝试的: public static void main(String[] ar

我需要检查该行是否包含必须为 已消除,并指示哪些符号将被消除。
如果有三个或更多具有相同符号的连续字符,则字符序列将替换为下划线(“”),并相应地替换为序列长度。例如,行“,,@,@,@,@,$,#,#,!”在消除过程后将被转换为“,,,,,$,$,,#,!”。
我只需要使用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);
    }
}
publicstaticvoidmain(字符串[]args){
字符串linha=“##,$$$,%%%,@%@@@,!!!!”,validos=“$#%!”;
对于(int i=0;i

这里的问题是,只用一个“\u1”替换一个序列,我不知道替换了哪些字符。

如果要同时替换三个字符,而要替换三个下划线,则缺少以下内容:

linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "___");
如果要用逗号分隔,请执行以下操作:

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

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

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

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

当然你可以用很多方法来做,而且这可能是一个很好的锻炼。这里有一个基本的实现,它只使用基本的循环结构,没有什么比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);
}
静态int索引(字符串lookInStr、字符lookUpChr){
返回lookInStr.indexOf(新字符串(新字符[]{lookUpChr,lookUpChr,lookUpChr}));
}
公共静态void main(字符串[]args){
字符串linha=“####,@@@@@@,$$$$,%%%,@%@@@@@、!!!!”,validos=“$#%!@”;
对于(int i=0;i=0){
整数计数=-1;
做{
计数++;
}while(linha.charAt(count+index)=currentSearchChar&&count+index=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); // ##,____,____,@%___,____
}
静态字符串转换(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
下面是简单的重复方法:

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

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

    return sb.toString();
}
静态字符串重复(字符串s,int repeatCount){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
到目前为止,您尝试了什么?我们不会为您编写所有代码。将其编辑到您的问题中,并将其格式化为代码。编辑您的原始帖子,而不是我allready看到的可能重复的帖子,并没有真正帮助我。问题是,如果序列有4个符号,那么它应该是4个下划线,如果有5个,那么就有5个下划线,依此类推…谢谢,我会尝试它,但如果有更优雅的方式来做这件事,我当然会感兴趣…非常感谢!但仍然不符合我的目的,我不能使用“char[]”,但我可以从这个开始工作,这很好。这不是最好的答案抱歉,现在最后的零作为最好的答案,但仍在等待…感谢FinalZero的回答,它真的有效,只有一个问题,在第二个周期中,它有效,但编程不正确,你知道我的意思吗?你的意思是创建一个跳过初始化变量的for循环是“不正确的”吗?如果这让你无法使用,那么我不知道该说什么。你写的任何东西来替换它都只是对它的一个更复杂的模仿,或者将它隐藏在库函数中。这是我的一位老师告诉我的解释:前2个循环已经链接起来用于共享计数器。第二,他们在内部循环外掺杂循环计数器的更新。循环是一种预期“表现良好”的循环,即不得以任何方式改变计数器的更新方式,尤其是在循环内!教师的标准似乎相当武断;我感兴趣的是他们想怎么做。