首页 > 解决方案 > 分隔符旁边的大写字符

问题描述

我正在寻找一种最短/快速的方法来提高分隔符旁边的字符并降低所有其他字符。

分隔符可以是:., -,

示例 1:

In: test.test-test test

Out: Test.Test-Test Test

示例 2:

In: TEST.TEST

Out: Test.Test

我现在有一个很长的方法,但认为它可以在一条线上很好地使用replace();

标签: javastringreplaceuppercase

解决方案


您可以使用正则表达式,捕获字符组并调用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上面的版本那样进行替换):

  1. [a-zA-Z]接受一个将被转换为大写的字符
  2. .*?接受任何东西,但“不情愿”而不是“贪婪” - 即它需要尽可能少(阅读有关量词的更多信息)
  3. [. -]+|$采用分隔符序列或字符串结尾字符

推荐阅读