2014-11-06 2 views
1

У меня есть строка, которая может выглядеть примерно так: «aaaaffddd» и вы хотите заменить символы, которые происходят 3 раза (или больше) с помощью [NUMBER_OF_CHARACTERS] [ONE_TIME_THE_CHARACTER] - я не очень уверен в RegEx, но я придумал «([Az]) (\ 1 {2,}), чтобы найти именно те. Тем не менее, в javas String.replaceAll() у меня нет возможности ссылаться на количество символов в группе (?), И если я использую Matcher.appendReplace() и StringBuffer, я теряю остальную часть своей строки, так как результат все равно должен включают символы, которые не встречаются 3 или более раз.Замените несколько символов по их количеству с помощью регулярного выражения

В приведенном выше примере следует кодировать в «4aff4d»

+1

Тогда вы не использовали 'Matcher.appendReplace()' правильно. Вы должны использовать его вместе с 'find' и' appendTail', и если он будет использован правильно, он скопирует несогласованные части исходной строки. Посмотрите на [документацию по API] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#appendReplacement (java.lang.StringBuffer,% 20java.lang.String)) для полного примера. – Holger

+0

Да, это была моя проблема, я добавил appendTail сразу после того, как я закончил замену всех матчей, и это сработало. – SBird

ответ

0

После использования appendReplacement на StringBuffer я должен был назвать appendTail в порядке для восстановления остальной части строки. Спасибо Хольгеру за его предложение!

0

Это не так просто, как вы не можете получить # спичек в сменной части легко. Попробуйте этот код:

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); 

ВЫВОД:

map {d=4, a=4} 
4aff4d 
0

Вы можете попробовать это (не тестировал)

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);