我正在网上做练习,遇到一个问题,要求我删除字符串中出现两次或多次的所有字符。
例如:
String s2 = "racecar";
将变成“e”,并且
String s3 = "aabbccc";
会变成“”,并且
String s4 = "Hello world";
会变成“He wrd”
我知道还有其他解决方案,但我想知道是否有正则表达式。
我尝试了一些不同的事情:
s = s.replaceAll(".{2,}", "");
s = s.replaceAll("[a-z]{2,}", "");
还有其他一些,但似乎全部都替换了整个字符串,而我只想替换所有出现多次的字符。
那么,有正则表达式吗?
为什么使用正则表达式?它不是正则表达式的用例。使用这个:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
String s1 = "racecar";
String s2 = "aabbccc";
String s3 = "Hello world";
System.out.println(removeRepeatingChars(s1)); // Output: "e"
System.out.println(removeRepeatingChars(s2)); // Output: ""
System.out.println(removeRepeatingChars(s3)); // Output: "He wrd"
}
public static String removeRepeatingChars(String input) {
// Count occurrences of each character
Map<Character, Long> charCount = input.chars()
.filter(ch -> !Character.isWhitespace(ch)) // Optional: ignore whitespace if needed
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, LinkedHashMap::new, Collectors.counting()));
// Build a regex pattern for characters occurring 2 or more times
String repeatingChars = charCount.entrySet().stream()
.filter(entry -> entry.getValue() >= 2)
.map(entry -> Pattern.quote(String.valueOf(entry.getKey())))
.collect(Collectors.joining("|"));
// If there are no repeating characters, return the input as-is
if (repeatingChars.isEmpty()) {
return input;
}
// Replace all repeating characters with an empty string
return input.replaceAll(repeatingChars, "");
}
}