1. 概述
Camel case 和 title case 通常用作字段和类型的标识符。我们可能希望将文本转换成这种格式。
这可以通过编写自定义代码或使用第三方库来实现。
在本教程中,我们将研究如何编写一些自定义字符串转换为驼峰式大小写,并且我们将探索一些可以帮助我们完成该任务的第三方库功能。
2. Java 解決方案
Camel case 允许我们通过删除空格并使用大写字母来显示单词边界来连接多个单词。
有两种类型:
驼峰小写,第一个单词的第一个字符是小写
驼峰大写,也称为标题大写,其中第一个单词的第一个字符是大写的:
thisIsLowerCamelCase ThisIsLowerCamelCase
在本教程中,我们将专注于转换为小驼峰格式,尽管这些技术很容易适应两者。
2.1.正则表达式(Regex)
我们可以使用正则表达式将包含单词的字符串拆分为数组:
String[] words = text.split("[\\W_]+");
这将在不属于单词的任何字符处拆分给定的字符串。下划线通常被视为正则表达式中的单词字符。 Camel 大小写不包含下划线,因此我们已将其添加到分隔符表达式中。
当我们有单独的单词时,我们可以修改它们的大小写并将它们重新组合为驼峰式:
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");
这个解决方案很简单,但它需要原始文本的几份副本才能计算答案。首先,它创建一个单词列表,然后以各种大写或小写格式创建这些单词的副本以组成最终字符串。对于非常大的输入,这可能会消耗大量内存。
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();
这里的分隔符是一个char ,表示预期的非单词字符。
让我们尝试使用空格作为分隔符的解决方案:
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,我们需要将其添加到我们的项目中:
<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,让我们将其依赖项添加到我们的项目中:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.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 可以帮助我们
。
0 评论