我有一个字符串,看起来像这样:
CALDARI_STARSHIP_ENGINEERING
我需要编辑它,使其看起来像这样
Caldari Starship Engineering
很不幸,现在已经是凌晨三点了,我怎么也无法弄清楚这个问题。我一直都很难处理字符串中的替换内容,所以希望能得到帮助,这将有助于我今后更好地理解如何处理这个问题。
我有一个字符串,看起来像这样:
CALDARI_STARSHIP_ENGINEERING
我需要编辑它,使其看起来像这样
Caldari Starship Engineering
很不幸,现在已经是凌晨三点了,我怎么也无法弄清楚这个问题。我一直都很难处理字符串中的替换内容,所以希望能得到帮助,这将有助于我今后更好地理解如何处理这个问题。
像这样的东西很简单:
String text = "CALDARI_STARSHIP_ENGINEERING";
text = text.replace("_", " ");
StringBuilder out = new StringBuilder();
for (String s : text.split("\\b")) {
if (!s.isEmpty()) {
out.append(s.substring(0, 1) + s.substring(1).toLowerCase());
}
}
System.out.println("[" + out.toString() + "]");
// prints "[Caldari Starship Engineering]"
这个split
在单词边界锚上进行。
Matcher
循环解决方案如果你不介意使用 StringBuffer
,你也可以使用 Matcher.appendReplacement/Tail
循环来实现:
String text = "CALDARI_STARSHIP_ENGINEERING";
text = text.replace("_", " ");
Matcher m = Pattern.compile("(?<=\\b\\w)\\w+").matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group().toLowerCase());
}
m.appendTail(sb);
System.out.println("[" + sb.toString() + "]");
// prints "[Caldari Starship Engineering]"
(?<=...)
来查看是否有一个单词边界\b
,然后是一个单词字符\w
。任何剩余的\w+
都需要匹配,以便将其转换为小写。
\l
\u
, \L
, 和 \U
。appendReplacement/Tail
只接受StringBuffer
StringBuilder
,因为它更快。只有在多线程应用程序中存在并发问题时,才应该使用 StringBuffer 替换 StringBuilder。 - Leni KirilovMatcher.appendReplacement/Tail
只接受 StringBuffer
。如果你想使用 StringBuilder
,那么就不能使用这些方法。 - polygenelubricants你可以尝试这个:
String originalString = "CALDARI_STARSHIP_ENGINEERING";
String newString =
WordUtils.capitalize(originalString.replace('_', ' ').toLowerCase());
WordUtils
是 Commons Lang 库(http://commons.apache.org/lang/)的一部分。
WordUtils
可用并且可以使用。 - Odedorg.apache.commons.lang
- Amber使用正则表达式:
String s = "CALDARI_STARSHIP_ENGINEERING";
StringBuilder camel = new StringBuilder();
Matcher m = Pattern.compile("([^_])([^_]*)").matcher(s);
while (m.find())
camel.append(m.group(1)).append(m.group(2).toLowerCase());
未经测试,但这是我一段时间以前实现相同功能的方式:
s = "CALDARI_STARSHIP_ENGINEERING";
StringBuilder b = new StringBuilder();
boolean upper = true;
for(char c : s.toCharArray()) {
if( upper ) {
b.append(c);
upper = false;
} else if( c = '_' ) {
b.append(" ");
upper = true;
} else {
b.append(Character.toLowerCase(c));
}
}
s = b.toString();
快速而简单的方法:
全部转换为小写
line.toLowerCase();
分割成单词:
String[] words = line.split("_");
words[i].substring(0, 1).toUpperCase()
isEmpty
检查是健壮的(但它可能不如您的解决方案高效)。 - aioobe