我正在尝试创建一种方法,该方法可以从字符串中删除所有重复项,或者根据参数仅在一行中保留相同的 2 个字符。
例如:
helllllllo -> helo
or
helllllllo -> hello
- 这保留了双字母
目前我通过执行以下操作删除重复项:
private String removeDuplicates(String word) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < word.length(); i++) {
char letter = word.charAt(i);
if (buffer.length() == 0 && letter != buffer.charAt(buffer.length() - 1)) {
buffer.append(letter);
}
}
return buffer.toString();
}
如果我想保留双字母,我正在考虑使用像 private String 这样的方法removeDuplicates(String word, boolean doubleLetter)
When doubleLetter
为 true 将会返回hello
not helo
我不确定在不重复大量代码的情况下执行此操作的最有效方法。
为什么不直接使用正则表达式呢?
public class RemoveDuplicates {
public static void main(String[] args) {
System.out.println(new RemoveDuplicates().result("hellllo", false)); //helo
System.out.println(new RemoveDuplicates().result("hellllo", true)); //hello
}
public String result(String input, boolean doubleLetter){
String pattern = null;
if(doubleLetter) pattern = "(.)(?=\\1{2})";
else pattern = "(.)(?=\\1)";
return input.replaceAll(pattern, "");
}
}
(.) --> matches any character and puts in group 1.
?= --> this is called a positive lookahead.
?=\\1 --> positive lookahead for the first group
总的来说,这个正则表达式会查找其自身后面的任何字符(正向前瞻)。例如 aa 或 bb 等。需要注意的是,实际上只有第一个字符才是匹配的一部分,所以在单词 'hello' 中,只匹配第一个 l ((?=\1) 部分是不属于比赛的一部分)。所以第一个 l 被一个空字符串替换,我们剩下 helo,它与正则表达式不匹配
第二个模式是同样的事情,但是这次我们展望第一组的两次出现,例如hello。另一方面,“hello”将不会被匹配。
在这里查看更多内容:Regex http://www.regular-expressions.info/lookaround.html
附:如果有帮助,请随意填写并接受答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)