java - (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++;
}
解决方案
您可以使用
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
方法内部,第二组内容被“转换”为它的长度。
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!
推荐阅读
- javascript - 带有 slug 值的动态下拉菜单和子菜单 php mysqli
- node.js - 我的请求代码没有打印 API 的正文
- java - 偶尔获取 JDBC 开始事务失败,然后自动恢复
- asp.net-core - 我们如何在扩展结果中使用子查询获得 Odata $expand 结果
- r - 关联图。相关错误:“x”必须是数字。所有字段都是数字
- javascript - 如何为 [ 和 { 和 ' 和 " 获取不同的 javascript 键码
- c++ - 递归函数计算序列中的平方和(并输出过程)
- java - java --version 中看不到采用openjdk-8-hotspot
- vue.js - 未设置组件复选框(vue、vee 验证)
- javascript - 点击后在 HTML 页面中查找外部元素