Java 用正则表达式替换多个字符的数量
我有一个字符串可能看起来像这样:“aaaaffddddd”,并希望用[NUMBER_of_characters][ONE_TIME_THE_CHARACTER]替换出现3次(或更多)的字符-我对正则表达式不是很有信心,但我想出了“([a-z])(\1{2,}”来精确地找到这些字符。但是,在javas String.replaceAll()中,我不可能引用组(?)中的字符数,如果我使用Matcher.appendReplace()和StringBuffer,我将丢失剩余的字符串,因为结果应该仍然包含不会出现3次或更多次的字符Java 用正则表达式替换多个字符的数量,java,regex,replace,Java,Regex,Replace,我有一个字符串可能看起来像这样:“aaaaffddddd”,并希望用[NUMBER_of_characters][ONE_TIME_THE_CHARACTER]替换出现3次(或更多)的字符-我对正则表达式不是很有信心,但我想出了“([a-z])(\1{2,}”来精确地找到这些字符。但是,在javas String.replaceAll()中,我不可能引用组(?)中的字符数,如果我使用Matcher.appendReplace()和StringBuffer,我将丢失剩余的字符串,因为结果应该仍然包
上述示例应编码为“4aff4d”这并不容易,因为您无法轻松获得替换零件中的匹配项。请尝试以下代码:
Pattern pat = Pattern.compile("(?i)([A-Z])(?=\\1{2})");
String str = "aaaaffdddd";
Matcher mat = pat.matcher(str);
Map<String, Integer> charMap = new HashMap<>();
while(mat.find()) {
String key = mat.group();
if (!charMap.containsKey(key))
charMap.put(key, 3);
else
charMap.put(key, charMap.get(key)+1);
}
System.out.println("map " + charMap);
for (Entry<String, Integer> e: charMap.entrySet()) {
str = str.replaceAll(e.getKey() + "+", e.getValue() + e.getKey());
}
System.out.println(str);
您可以试试这个(未测试)
在StringBuffer上使用appendReplacement之后,我不得不调用appendTail来重建字符串的其余部分。感谢霍尔格的建议 然后您没有正确使用
Matcher.appendReplace()
。您必须将它与find
和appendTail
一起使用,如果使用正确,它将复制源字符串中不匹配的部分。请看一个完整的示例。是的,这确实是我的问题,我在替换完所有匹配项后添加了appendTail,这很有效。
map {d=4, a=4}
4aff4d
String str = "aaaaffdddd";
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("([A-z])(\\1{2,})");
Matcher m = p.matcher(str);
while (m.find()) {
m.appendReplacement(sb, "" + (m.group(2).length() + 1) + m.group(1));
}
System.out.println(sb);