我正在尝试找到基于模式执行行程编码的最简洁方法。目标是通过分解由几个相同模式组成的子字符串来压缩字符串。
原始字符串:
start{3}{3}{3}{3}end
如您所见,有4个“{3}
”模式。可以通过将4个“{3}
”模式的运行表达为$4{3}
来压缩此String。
压缩字符串我想获得:
start$4{3}end
我尝试了String.replaceAll(regex, replacement)
方法。我知道myString.replaceAll("\\{([^<])\\}", "$1")
只能用它的值替换整个模式,但我找不到如何使用正则表达式检测和计算相同模式的运行长度。
使用正则表达式是个好主意还是有其他“更好”的方法来做到这一点?
答案 0 :(得分:2)
您可以将java.util.zip.GZIPInputStream
和java.util.zip.GZIPOutputStream
与ByteArrayInputStream
和ByteArrayOutputStream
结合使用来gzip / gunzip你的字符串,这可能比编写自己的压缩算法更好(除非您可以使用有关要压缩的数据的知识。)
答案 1 :(得分:1)
我只是得到如下输出。应该有比这更有效的方法。但希望这会对你有所帮助
String s = "start{3}{3}{3}{3}end";
String pString = "\\{3\\}";
Pattern p = Pattern.compile(pString);
Matcher m = p.matcher(s);
int count = 0;
while (m.find()) {
count++;
}
System.out.println(s.replaceAll(pString, "-").replaceFirst("-{"+count+"}", "\\$"+count+pString));