2016-11-28 66 views
2

我隨機字符串,例如"aaaaaaBccccCCCCd"我需要做的正則表達式,其搜索的文本組以獲得效果"a6B1c4C4d1"。我的正則表達式看起來像那個"(\\D+)\\D*\\1",但他失去了單個字母,所以在這個樣本BdJava的正則表達式的壓縮字符串

也許會有人有一個想法?

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class Compress { 
    public static void main(String[] args) { 
     String text = "aaaaaaBccccCCCCd"; 
     String regex = "(\\D+)\\D*\\1";   // or (.+).*\\1 
     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(text); 
     String result = new String(); 
     while (matcher.find()) { 
      String letter = matcher.group().substring(0, 1); 
      String numberOfLetter = String.valueOf(matcher.group().length()); 
      result = result + letter + numberOfLetter; 
     } 
     System.out.println(result); 
    } 
} 

謝謝。

+0

爲什麼'\ D'?你只針對非數字嗎? –

+0

是的,只有非數字 –

回答

0

使用基於Matcher#appendReplacement以下方法:

String text = "aaaaaaBccccCCCCd"; //a6B1c4C4d1 
String regex = "(.)(\\1*)"; 
String pattern = "test"; 
Pattern r = Pattern.compile(regex); 
Matcher m = r.matcher(text); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(sb, m.group(1) + (m.group(2).length()+1)); 
} 
m.appendTail(sb); 
System.out.println(sb); 

Java demo

(.)(\1*)將捕捉任何字符到第1組,然後將捕捉到組相同內容的2次零次或多次重複。在「回調」中,組1與組2的長度相加,以增加組1的長度。

+1

太好了。非常感謝你! –