我想在Java中了解一下这个Ruby代码的等价物:
str.gsub(/(.)\1*/) do
"#{$&.size}#{$1}"
end
它的作用是用重复次数和字符本身替换相等连续字符的出现。 例如:“111”将变为“31”,因为有三个,“111223”将变为“312213”,因为有三个,两个二,一个三等。它基本上被称为“外观和 - “数字。我想用正则表达式来完成这个,可能没有任何循环。
答案 0 :(得分:2)
好吧,您可以使用基于Matcher#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
请参阅IDEONE demo
答案 1 :(得分:0)
考虑这个记录的例子
//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());