模式游程编码
Posted
技术标签:
【中文标题】模式游程编码【英文标题】:Pattern run-length encoding 【发布时间】:2014-09-08 14:42:51 【问题描述】:我正在尝试找到最简洁的方法来执行基于模式的行程编码。目标是通过分解由几个相同模式组成的子字符串来压缩字符串。
原始字符串:
start3333end
如您所见,有 4 个“3
”模式。可以通过将 4 个“3
”模式的运行表示为 $43
来压缩此字符串。
我想获取的压缩字符串:
start$43end
我尝试了String.replaceAll(regex, replacement)
方法。我知道myString.replaceAll("\\([^<])\\", "$1")
只能用它的值替换整个模式,但是我找不到如何使用正则表达式检测和计算相同模式运行的长度。
使用正则表达式是个好主意还是有其他“更好”的方法来做到这一点?
【问题讨论】:
你不能使用 Pattern 和 Matcher 来获取组数吗? 【参考方案1】:您可以将java.util.zip.GZIPInputStream
和java.util.zip.GZIPOutputStream
与ByteArrayInputStream
和ByteArrayOutputStream
结合使用来gzip/gunzip 您的字符串,这可能比编写自己的压缩算法更好(除非您可以使用有关数据的知识来被压缩)。
【讨论】:
【参考方案2】:我只是得到如下输出。应该有比这更有效的方法。但希望这会对你有所帮助
String s = "start3333end";
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));
【讨论】:
这应该是一个很好的起点,感谢您的帮助!以上是关于模式游程编码的主要内容,如果未能解决你的问题,请参考以下文章