我需要检查该行是否包含必须的字符串
消除并指出哪些符号将被消除。
如果有三个或更多具有相同符号的连续字符,则字符序列将被下划线(“”)替换,因此将与序列长度替换。例如,行“,_,@,@,@,@,$,$,,#,#,!”将被转换为“,_,_,_,_,_,_,$,$,_,#,#,!”消除过程后。
我只需要使用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);
}
}
这里的问题是用一个“_”代替一个序列,我不知道哪些字符被替换。
答案 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();
}