我正在寻找一种最短/最快速的方式来将字符放在分隔符旁边并降低所有其他字符。
分隔符可以是:.
,-
,
示例1:
In: test.test-test test
Out: Test.Test-Test Test
示例2:
In: TEST.TEST
Out: Test.Test
我目前有一个很长的方法,但是认为可以很好地使用replace();
答案 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
版本那样进行替换):
[a-zA-Z]
包含一个将转换为大写字母的字符.*?
可以接受任何内容,但它是“不愿意”而不是“贪婪”的,即它所需要的时间尽可能少(请阅读more about quantifiers)[. -]+|$
采用一系列分隔符或字符串末尾答案 1 :(得分:0)
您可以使用Apache的 WordUtils 库。他们拥有此方法 capitalizeFully(String str, char[] delimiters),可在方案中使用。这是该方法的说明:
将字符串中所有用定界符分隔的单词转换为大写单词,即每个单词由一个标题大写字母然后是一系列小写字母组成。
您可以按以下方式使用此方法:
WordUtils.capitalizeFully("test.test-test test", {' ', '.', '-'})
返回值:
Test.Test-Test Test