Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用正则表达式替换多个字符的数量_Java_Regex_Replace - Fatal编程技术网

Java 用正则表达式替换多个字符的数量

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,我将丢失剩余的字符串,因为结果应该仍然包

我有一个字符串可能看起来像这样:“aaaaffddddd”,并希望用[NUMBER_of_characters][ONE_TIME_THE_CHARACTER]替换出现3次(或更多)的字符-我对正则表达式不是很有信心,但我想出了“([a-z])(\1{2,}”来精确地找到这些字符。但是,在javas String.replaceAll()中,我不可能引用组(?)中的字符数,如果我使用Matcher.appendReplace()和StringBuffer,我将丢失剩余的字符串,因为结果应该仍然包含不会出现3次或更多次的字符


上述示例应编码为“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);