首页 > 解决方案 > (hello-> h3o) 如何在字符串中替换中间字母为替换的字母数

问题描述

我需要构建一个接收字符串的方法,例如“骑大象真的很有趣!”。并返回另一个类似的字符串,在这个例子中返回应该是:“e6t-r3s are r4y fun!”。(因为 e-lephan-t 有 6 个中间字母,r-ide-s 有 3 个中间字母等等)

为了获得回报,我需要在每个单词中替换中间字母以替换替换的字母数量,保持不变,所有内容都不是字母以及每个单词的第一个和最后一个字母。

目前我尝试使用正则表达式将接收到的字符串拆分为单词,并将这些单词保存在字符串数组中,我还有另一个 int 数组,其中保存了中间字母的数量,但我不知道如何将数组和符号加入正确的字符串以返回

    String string="elephant-rides are really fun!";
String[] parts = string.split("[^a-zA-Z]");
int[] sizes = new int[parts.length];
int index=0;

for(String aux: parts)
{

    sizes[index]= aux.length()-2;
    System.out.println( sizes[index]);
    index++;

}

标签: javaregexstring

解决方案


您可以使用

String text = "elephant-rides are really fun!";
Pattern r = Pattern.compile("(?U)(\\w)(\\w{2,})(\\w)");
Matcher m = r.matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group(1) + m.group(2).length() + m.group(3));
}
m.appendTail(sb); // append the rest of the contents
System.out.println(sb);
// => e6t-r3s are r4y fun!

查看Java 演示

在这里,(?U)(\\w)(\\w{2,})(\\w)将捕获它的任何 Unicode 单词 char 匹配到第 1 组,然后将任何 2 个或更多单词 char 捕获到第 2 组,然后将单个单词 char 捕获到第 3 组,在.appendReplacement方法内部,第二组内容被“转换”为它的长度。

Java 9+

String text = "elephant-rides are really fun!";
Pattern r = Pattern.compile("(?U)(\\w)(\\w{2,})(\\w)");
Matcher m = r.matcher(text);
String result = m.replaceAll(x -> x.group(1) + x.group(2).length() + x.group(3));
System.out.println( result );
// => e6t-r3s are r4y fun!

推荐阅读