java - 分隔符旁边的大写字符
问题描述
我正在寻找一种最短/快速的方法来提高分隔符旁边的字符并降低所有其他字符。
分隔符可以是:.
, -
,
示例 1:
In: test.test-test test
Out: Test.Test-Test Test
示例 2:
In: TEST.TEST
Out: Test.Test
我现在有一个很长的方法,但认为它可以在一条线上很好地使用replace();
解决方案
您可以使用正则表达式,捕获字符组并调用toUpperCase()
它们toLowerCase()
:
StringBuffer sb = new StringBuffer();
Matcher m = Pattern.compile("([a-z])([^. -]*)", Pattern.CASE_INSENSITIVE).matcher(s);
while (m.find()) {
m.appendReplacement(sb, m.group(1).toUpperCase() + m.group(2).toLowerCase());
}
System.out.println(m.appendTail(sb).toString());
编辑:
另一种使用StringBuilder
(不同步,因此比 更快StringBuffer
)的解决方案,它消除了使用Matcher#appendReplacement(StringBuffer)
并Matcher#appendTail(StringBuffer)
以更复杂的正则表达式为代价:
StringBuilder sb = new StringBuilder();
Matcher m = Pattern.compile("([a-zA-Z])(.*?)([. -]+|$)").matcher(s);
while (m.find()) {
sb.append(m.group(1).toUpperCase());
sb.append(m.group(2).toLowerCase());
sb.append(m.group(3));
}
System.out.println(sb.toString());
请注意,有三个捕获组而不是两个(我们也需要捕获分隔符,因为这不会像StringBuffer
上面的版本那样进行替换):
[a-zA-Z]
接受一个将被转换为大写的字符.*?
接受任何东西,但“不情愿”而不是“贪婪” - 即它需要尽可能少(阅读有关量词的更多信息)[. -]+|$
采用分隔符序列或字符串结尾字符
推荐阅读
- python-3.x - 如何创建一个列,该列显示具有“对象”数据类型的列中每个值的数据类型
- git - 从 gitlab 存储库而不是本地目录导入 terraform 模块会产生略有不同的 terraform 计划输出
- r - 删除重复出现的 GitHub 凭据提示
- sql - 在 presto 中优化窗口查询
- unity3d - Unity:从 FBX 文件中获取每一帧的关节旋转
- c# - Specflow - 如何在下一步中将响应作为变量传递
- raspberry-pi3 - 如何更改 pjsip 中的默认音频设备
- azure-aks - Azure Kubernetes 集群安全
- pandas - 将表格 pandas DataFrame 转换为嵌套的 pandas DataFrame
- javascript - JS 异步不起作用 | 由于背景图像导致的 LCP 问题,这是用 JS 设置的