1. 概述
本文我们将学习如何将字符串转换为驼峰式命名法。
2.Java原生实现
驼峰式命名法(Camel case)是一种不使用空格的书写方式,通过将每个单词的首字母大写来连接多个单词。
驼峰又分为两种类型:
- 小驼峰式,第一个单词的第一个字符为小写(常用)
- 大驼峰式,第一个单词的第一个字符为大写:
thisIsLowerCamelCase
ThisIsLowerCamelCase
本文,我们将重点关注转换为小驼峰式
2.1.正则表达式(Regex)
我们可以使用正则表达式将包含单词的字符串拆分为数组:
String[] words = text.split("[\\W_]+");
我们通过空格、下划线等分隔符将字符串拆分为单词,然后重新组装为驼峰式:
StringBuilder builder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
String word = words[i];
if (i == 0) {
word = word.isEmpty() ? word : word.toLowerCase();
} else {
word = word.isEmpty() ? word : Character.toUpperCase(word.charAt(0)) + word.substring(1).toLowerCase();
}
builder.append(word);
}
return builder.toString();
在这里,我们将数组中的第一个单词转换为小写。对于数组中的每个其他单词,我们将第一个字符转换为大写,其余字符转换为小写。
下面测试:
// 空格分隔的大写字母 转为 驼峰式
assertThat(toCamelCaseByRegex("THIS STRING SHOULD BE IN CAMEL CASE"))
.isEqualTo("thisStringShouldBeInCamelCase");
// 下划线 转为 驼峰式
assertThat(toCamelCaseByRegex("this_string_should_be_in_camel_case"))
.isEqualTo("thisStringShouldBeInCamelCase");
这个解决方案很简单,但需要多次字符串复制。 如果输入非常大,这可能会消耗大量内存 。
2.2.遍历字符串
我们可以用一个循环来替换上述算法,该循环在每个字符通过原始字符串时计算出每个字符的正确大小写。这会跳过任何分隔符并一次将一个字符写入 StringBuilder 。
首先,我们需要跟踪转换的状态:
boolean shouldConvertNextCharToLower = true;
然后我们迭代源文本,跳过或适当地大写每个字符:
for (int i = 0; i < text.length(); i++) {
char currentChar = text.charAt(i);
if (currentChar == delimiter) {
shouldConvertNextCharToLower = false;
} else if (shouldConvertNextCharToLower) {
builder.append(Character.toLowerCase(currentChar));
} else {
builder.append(Character.toUpperCase(currentChar));
shouldConvertNextCharToLower = true;
}
}
return builder.toString();
这里的 delimiter 是单词分隔符。
例如使用空格作为分隔符:
assertThat(toCamelCaseByIteration("THIS STRING SHOULD BE IN CAMEL CASE", ' '))
.isEqualTo("thisStringShouldBeInCamelCase");
使用下划线分隔符:
assertThat(toCamelCaseByIteration("THIS_STRING_SHOULD_BE_IN_CAMEL_CASE", '_'))
.isEqualTo("thisStringShouldBeInCamelCase");
3.使用第三方库
3.1.使用Apache
使用Apache Commons Text ,首先添加Maven依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
该库在 CaseUtils 中提供了 toCamelCase 方法:
String camelCase = CaseUtils.toCamelCase(text, false, delimiter);
让我们尝试一下:
assertThat(CaseUtils.toCamelCase("THIS STRING SHOULD BE IN CAMEL CASE", false, ' '))
.isEqualTo("thisStringShouldBeInCamelCase");
为了将字符串转换为标题大小写或大驼峰大小写,我们需要将 true 传递给 toCamelCase 方法:
String camelCase = CaseUtils.toCamelCase(text, true, delimiter);
让我们尝试一下:
assertThat(CaseUtils.toCamelCase("THIS STRING SHOULD BE IN CAMEL CASE", true, ' '))
.isEqualTo("ThisStringShouldBeInCamelCase");
3.2.使用Guava
通过一些预处理,我们可以通过Guava将字符串转换为驼峰。
要使用 Guava,我们将其依赖项添加到我们的项目中:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Guava 有一个实用程序类 CaseFormat ,用于格式转换:
String camelCase = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "THIS_STRING_SHOULD_BE_IN_CAMEL_CASE");
大写字母下划线,转小驼峰式:
assertThat(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "THIS_STRING_SHOULD_BE_IN_CAMEL_CASE"))
.isEqualTo("thisStringShouldBeInCamelCase");
如果我们的字符串已经采用这种格式,那就没问题了。但是,如果我们希望使用不同的分隔符并处理混合情况,我们需要预处理我们的输入:
String toUpperUnderscore = "This string should Be in camel Case"
.toUpperCase()
.replaceAll(' ', "_");
首先,我们将给定的字符串转换为大写。然后,我们用下划线替换所有分隔符。生成的格式与 Guava 的 CaseFormat.UPPER_UNDERSCORE 等效。 现在我们可以使用 Guava 来生成驼峰版本:
assertThat(toCamelCaseUsingGuava("THIS STRING SHOULD BE IN CAMEL CASE", " "))
.isEqualTo("thisStringShouldBeInCamelCase");
4。结论
在本教程中,我们学习了如何将字符串转换为驼峰式大小写。
首先,我们构建了一种将字符串拆分为单词的算法。然后我们构建了一个迭代每个字符的算法。
最后,我们研究了如何使用一些第三方库来实现结果。 Apache Commons Text 非常接近我们的需求,Guava 在进行一些预处理后可以帮助我们。
惯例,完整的源代码可以在 GitHub 上获取。