如何在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个循环已经链接起来用于共享计数器。第二,他们在内部循环外掺杂循环计数器的更新。循环是一种预期“表现良好”的循环,即不得以任何方式改变计数器的更新方式,尤其是在循环内!教师的标准似乎相当武断;我感兴趣的是他们想怎么做。