2016-11-28 13 views
2

私はランダムな文字列を持っています"aaaaaaBccccCCCCd"効果を得るためにグループのテキストを検索するmake regexが必要"a6B1c4C4d1"。正規表現は"(\\D+)\\D*\\1"のように見えますが、一文字が失われています。このサンプルではBdです。Java Regex compress String

誰かが考えていると思いますか?

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はグループ1の長さを考慮して増分されたグループ2の長さと連結されます。

+1

です。どうもありがとうございました! –