1

我正在尝试找到最简洁的方法来执行基于模式的游程编码。目标是通过分解由几个相同模式组成的子字符串来压缩字符串。

原始字符串:

start{3}{3}{3}{3}end

如您所见,有 4 个 " {3}" 模式。可以通过将 4 个 " {3}" 模式的运行表示为$4{3}.

我想获得的压缩字符串:

start$4{3}end

我试过这个String.replaceAll(regex, replacement)方法。我知道myString.replaceAll("\\{([^<])\\}", "$1")它只能用它的值替换整个模式,但我找不到如何使用正则表达式检测和计算相同模式的运行长度。

使用正则表达式是个好主意还是有其他“更好”的方法来做到这一点?

4

2 回答 2

2

您可以将java.util.zip.GZIPInputStreamand与andjava.util.zip.GZIPOutputStream结合使用来 gzip/gunzip 您的字符串,这可能比编写自己的压缩算法更好(除非您可以使用有关要压缩的数据的知识)。ByteArrayInputStreamByteArrayOutputStream

于 2014-09-08T14:59:19.343 回答
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));
于 2014-09-08T15:10:03.877 回答