将occurence替换为数字(在Java中以正则表达式的形式查看和说出数字)

将occurence替换为数字(在Java中以正则表达式的形式查看和说出数字),java,ruby,regex,count,Java,Ruby,Regex,Count,我想了解一下Java中与此Ruby代码相当的代码: str.gsub(/(.)\1*/) do "#{$&.size}#{$1}" end 它所做的是用重复次数和字符本身替换相等连续字符的出现。 例如:“111”将变为“31”,因为有三个1,“111223”将变为“312213”,因为有三个1、两个2和一个3等等。它基本上被称为“看并说”数字。我想使用正则表达式来完成这项工作,可能没有任何循环。好的,您可以使用基于匹配器的代码#appendReplacement: String

我想了解一下Java中与此Ruby代码相当的代码:

str.gsub(/(.)\1*/) do
    "#{$&.size}#{$1}"
end
它所做的是用重复次数和字符本身替换相等连续字符的出现。
例如:“111”将变为“31”,因为有三个1,“111223”将变为“312213”,因为有三个1、两个2和一个3等等。它基本上被称为“看并说”数字。我想使用正则表达式来完成这项工作,可能没有任何循环。

好的,您可以使用基于
匹配器的代码#appendReplacement

String s = "111";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(.)\\1+").matcher(s);
while (m.find()) {
    m.appendReplacement(result, m.group().length() + m.group(1));
}
m.appendTail(result);
System.out.println(result.toString()); // => 31

请参见

考虑这个记录在案的示例

    //For concatenating output
    StringBuilder sb = new StringBuilder();
    //The Matcher finding digits followed by at least one of the same
    Matcher m = Pattern.compile("(\\d)\\1+").matcher("1112222233");
    //While consecutive digits found
    while(m.find()) {
        //Append length of match (= number of same digits)
        sb.append(m.group().length())
        //append the matched character / digit
            .append(m.group(1));
    }
    //output
    System.out.println(sb.toString());

您的解决方案不会在源中保留非重复字符。例如,尝试
111222abcdd