Java 需要将下划线分隔的单词转换为人类可读的形式吗?
我需要将下划线分隔的单词(如事物名称)转换为可读性更好的格式(如“事物名称”),在少数情况下,我需要类似“事物名称”的格式 我有下面的代码,我转换使用谷歌番石榴的CaseFormat类。但它没有给我确切的预期结果。有人能给我建议一个更好的转换方法吗Java 需要将下划线分隔的单词转换为人类可读的形式吗?,java,regex,string,java-8,Java,Regex,String,Java 8,我需要将下划线分隔的单词(如事物名称)转换为可读性更好的格式(如“事物名称”),在少数情况下,我需要类似“事物名称”的格式 我有下面的代码,我转换使用谷歌番石榴的CaseFormat类。但它没有给我确切的预期结果。有人能给我建议一个更好的转换方法吗 StringUtils.join(StringUtils.splitByCharacterTypeCamelCase( CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_
StringUtils.join(StringUtils.splitByCharacterTypeCamelCase(
CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, input)), " ")
输入:事物的名称预期:事物名称
实际:事物的名称
PS:我还需要类似于事物名称(of to of)的东西使用java-8,您可以在一行中完成:
String str = "NAME_OF_THINGS";
Arrays.stream(str.replaceAll("_", " ").toLowerCase().split(" "))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1) + " ")
.forEach(System.out::print);
在这里,我们用“
替换所有出现的”
,然后将整个字符串转换为小写。接下来,我们根据“
拆分它,然后执行子字符串操作以获得结果
这将提供以下输出:
事物的名称
要仅获取首字母大写,请使用:
String newString = Character.toUpperCase(str.charAt(0)) + str.substring(1)
.replaceAll("_", " ").toLowerCase();
这使得:
事物的名称
还是这个
input.substring(0,1) + input.substring(1).replaceAll("_", " ").toLowerCase()
使用
模式
:
String result = Pattern.compile("_")
.splitAsStream(source)
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase())
.collect(Collectors.joining(" "));
结果:
Name Of Things
如果您真的不想将的大写,您可以再添加一个映射函数来处理此问题:
Arrays.stream(str.toLowerCase().split("_"))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1) + " ")
.map(e -> e.equalsIgnoreCase("Of ") ? "of " : e)
.forEach(System.out::println);
或者,如果希望结果为字符串
:
String result = Arrays.stream(str.toLowerCase().split("_"))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
.map(e -> e.equalsIgnoreCase("Of") ? "of" : e)
.collect(Collectors.joining(" "));
输出:
然后,如果您想进一步概括您的任务,以包含更多应该大写的单词(“And”,“The”,等等),那么您可以创建一个列表,列出所有应该大写的单词,并执行以下操作:
String newStr = Arrays.stream(str.toLowerCase().split("_"))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
.map(e -> notCap.contains(e) ? notCap.get(notCap.indexOf(e)).toLowerCase() : e)
.collect(Collectors.joining(" "));
其中notCap
是您的列表
由于“适当的标题格”在文化上是可变的(例如,在英语中,我们知道标题中应该是“of”而不是“of”),因此您可能需要使用自己的附加意义检查功能。在您的示例中,“Expected”实际上是句子的大小写,因为东西不是大写的。句子大小写=事物的名称。标题格(正确)=事物名称。标题大小写(来自文化不可知结果)=事物名称。“s.substring(0,1).toUpperCase()
”->Character.toUpperCase(s.charAt(0))
。但是,根据预期的输出,无论如何,只有第一个单词应该大写。@Nichold问这个问题,我甚至可以用我共享的上述代码实现。但我需要像“事物名称”和“事物名称”这样的东西。如果我的问题不正确,我很抱歉clear@NicholasK这解决了我的主要问题。但我也需要类似于事物名称的东西。可能吗?或者我应该编写一个单独的函数,将
的转换为
的,您可能需要修改第二个代码段以获得结果。我将把它留给你作为一个练习:(它应该相当直接)同时,如果答案有帮助,请考虑接受/接受它。
String newStr = Arrays.stream(str.toLowerCase().split("_"))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
.map(e -> notCap.contains(e) ? notCap.get(notCap.indexOf(e)).toLowerCase() : e)
.collect(Collectors.joining(" "));