分隔符旁边的大写字母

时间:2018-06-20 10:48:41

标签: java string replace uppercase

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

分隔符可以是:.-

示例1:

In: test.test-test test

Out: Test.Test-Test Test

示例2:

In: TEST.TEST

Out: Test.Test

我目前有一个很长的方法,但是认为可以很好地使用replace();

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式,捕获字符组并在它们上调用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());

请注意,捕获组有3个,而不是2个(我们也需要捕获分隔符,因为这不能像上面的StringBuffer版本那样进行替换):

  1. [a-zA-Z]包含一个将转换为大写字母的字符
  2. .*?可以接受任何内容,但它是“不愿意”而不是“贪婪”的,即它所需要的时间尽可能少(请阅读more about quantifiers
  3. [. -]+|$采用一系列分隔符或字符串末尾

答案 1 :(得分:0)

您可以使用Apache的 WordUtils 库。他们拥有此方法 capitalizeFully(String str, char[] delimiters),可在方案中使用。这是该方法的说明:

  

将字符串中所有用定界符分隔的单词转换为大写单词,即每个单词由一个标题大写字母然后是一系列小写字母组成。

您可以按以下方式使用此方法:

WordUtils.capitalizeFully("test.test-test test", {' ', '.', '-'}) 

返回值:

Test.Test-Test Test